6

有人可以向我解释Task.Wait(CancellationToken)重载的用法吗? MSDN没有说太多关于它...Task.Wait方法(CancellationToken)

这是怎么了,我通常处理任务取消:

 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); 
     } 

所以当它是有用的传递令牌等待的方法?

回答

13

考虑要取消等待任务的情况下,实际上并没有取消任务本身......要么是因为任务不处理取消本身,还是因为你真的想保持与去该任务,但(比方说)回应用户“这需要一段时间......但它仍在进行中,关闭浏览器是安全的。” (或其他)

+0

谢谢,在白皮书中找到了答案,请参阅下面的评论。 – Tsef

3

在微软白皮书发现这一点:

这也是值得注意的Task.Wait(过载,需要一个与的CancellationToken签名Task.Wait(的CancellationToken)的存在)。这个重载需要一个令牌,以便等待可以被取消;这种超载与取消任务无关,而是可能导致等待过早返回。如果使用Task.Wait(ct)并且等待由于检测到令牌已被发送而中断,则会抛出OperationCanceledException(ct)来指示等待操作已取消。

+1

这不正是我回答说的基本上? “考虑你想取消等待任务的情况” –

+0

对不起,它没有被错误标记。改回它。 – Tsef

相关问题