一梭键盘任平生 2022-10-14 11:57 采纳率: 100%
浏览 76
已结题

Task.FromCanceled 这个方法的用途是什么?有什么用

问题遇到的现象和发生背景

Task.FromCanceled 它因指定的取消标记进行的取消操作而完成。
而且建议是和await一起用,我没弄懂它的作用是什么,用法是什么?

用代码块功能插入代码,请勿粘贴截图
static void Main(string[] args) {
        DoSth();
        Console.WriteLine($"主线程开始沉睡");
        Thread.Sleep(2000);
        Console.WriteLine($"主线程沉睡结束,顺便结束task");
        cancellationTokenSource.Cancel();
        Console.ReadKey();
    }
    static CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    static async void  DoSth() {
        Task task = Task.Run(() => {
            Console.WriteLine($"Task任务开始沉睡");
            Thread.Sleep(3000);
            Console.WriteLine($"Task任务沉睡结束,执行完成");
        }, cancellationTokenSource.Token);
        await Task.FromCanceled(cancellationTokenSource.Token);
        Console.WriteLine($"DoSth 任务完成");
    }

运行结果及报错内容

我尝试这样使用 但是报错了

我的解答思路和尝试过的方法

我刚开始以为是持有取消标记的任务被取消就会使await Task.FromCanceled(cancellationTokenSource.Token);的等待结束 而执行后续方法,可是按照我的测试报错了,我现在有点不懂这个方法的用途是什么?

我想要达到的结果

希望 有老哥给详细说下

  • 写回答

1条回答 默认 最新

  • wanghui0380 2022-10-14 17:04
    关注

    请加上一句话

    try
    {
    await Task.FromCanceled(cancellationTokenSource.Token);
    }
    catch
    {
    }
    
    

    你就知道问题了,因为他已经挂了。

    原因:其实你上一个提问我已经告诉你答案了,而你认为他们告诉你才是真理。

    Task.FromResult
    Task.CompletedTask
    Task.FromException
    其实这几个都是一个意思,就是从池里产生一个具备对应状态的Task出来,他不代表task执行,而是代表执行结果

    而Task.FromCanceled的正确执行语句为
    if(token.IsCancellationRequested)
    Task.FromCanceled(token) //取消了情况他会正常执行,没有取消的情况他直接异常

    如果令牌取消了,那么产生一个已经取消的task,至于这个task有啥用,你的例子没有用,因为这些东西都是用来 产生结果用来回调通知给外面的
    比如

    Task xxxx(token)
    {
    f(token.IsCancellationRequested)
    return Task.FromCanceled(token) //这是用来产生一个状态为取消状态的task,同是retrun给上层,告诉上层他取消了
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日
  • 创建了问题 10月14日