Task.Wait方法(CancellationToken)

时间:2013-07-29 08:50:13

标签: c# multithreading task-parallel-library cancellation-token

有人可以向我解释一下Task.Wait(CancellationToken)重载的用法吗? MSDN确实对它说了很多......

这就是我通常处理任务取消的方式:

        var source = new CancellationTokenSource();
        var task = Task.Factory.StartNew(() => 
        {
            while (true)
            {
                source.Token.ThrowIfCancellationRequested();
            }
        }, source.Token);

        try
        {
            task.Wait();
        }
        catch (AggregateException exc)
        {
            exc.Flatten().Handle(e => e is OperationCanceledException);
        }

那么什么时候将令牌传递给Wait方法有用呢?

2 个答案:

答案 0 :(得分:14)

考虑你要取消等待任务的情况,而不是实际取消任务本身...因为任务本身不处理取消,或者因为你实际上想要保留继续执行任务,但(比如)回应用户“这需要一段时间......但它仍在进行中。关闭浏览器是安全的。” (或者其他什么。)

答案 1 :(得分:3)

在Microsoft白皮书中找到了这个:

  

值得注意的是,Task.Wait()存在一个重载,它带有一个带有签名Task.Wait(CancellationToken)的CancellationToken。此重载需要一个令牌,以便可以取消等待;此重载与取消任务无关,而是可能导致等待过早返回。如果使用Task.Wait(ct)并且因为检测到令牌已经发出信号而中断了等待,那么将抛出OperationCanceledException(ct)以指示等待操作已被取消。