7

有人可以向我解释 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 方法有用呢?

4

2 回答 2

15

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

于 2013-07-29T08:57:45.883 回答
5

在 Microsoft 白皮书中发现了这一点:

有趣的是,Task.Wait() 存在一个重载,它接受带有签名 Task.Wait(CancellationToken) 的 CancellationToken。这个重载需要一个令牌,以便可以取消等待;此重载与取消任务无关,而是可能导致等待过早返回。如果使用 Task.Wait(ct) 并且由于检测到令牌已发出信号而中断等待,则将抛出 OperationCanceledException(ct) 以指示等待操作已取消。

于 2013-07-29T08:57:33.053 回答