Task.Wait 方法(CancellationToken)

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方法是有用的呢?
2个回答

16
考虑一种情况:您想要取消等待任务,而不实际取消任务本身...可能是因为任务不能处理取消,也可能是因为您实际上想继续执行任务,但是(比如)向用户响应“这需要一些时间……但它仍在进行中。安全关闭您的浏览器。”(或其他内容)。

谢谢,我在一份白皮书中找到了答案,请看下面的评论。 - Tsef

5

在微软的一份白皮书中发现了以下内容:

有趣的是,Task.Wait() 还有一个带有 CancellationToken 参数的重载方法 Task.Wait(CancellationToken)。这个重载方法接收一个 token,以便可以取消等待;这个重载方法与取消任务无关,而是可能会导致等待提前返回。如果使用 Task.Wait(ct) 并且等待被中断,因为它检测到令牌已被发出信号,则会抛出 OperationCanceledException(ct) 异常,表示等待操作已被取消。


1
这不就是我的答案所说的吗?“考虑你想取消等待任务的情况”。 - Jon Skeet
抱歉,这是因为错误而未标记的。已更改回来。 - Tsef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接