有人可以向我解释一下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方法有用呢?
答案 0 :(得分:14)
考虑你要取消等待任务的情况,而不是实际取消任务本身...因为任务本身不处理取消,或者因为你实际上想要保留继续执行任务,但(比如)回应用户“这需要一段时间......但它仍在进行中。关闭浏览器是安全的。” (或者其他什么。)
答案 1 :(得分:3)
在Microsoft白皮书中找到了这个:
值得注意的是,Task.Wait()存在一个重载,它带有一个带有签名Task.Wait(CancellationToken)的CancellationToken。此重载需要一个令牌,以便可以取消等待;此重载与取消任务无关,而是可能导致等待过早返回。如果使用Task.Wait(ct)并且因为检测到令牌已经发出信号而中断了等待,那么将抛出OperationCanceledException(ct)以指示等待操作已被取消。