具有取消支持的Task.Run

dar*_*ala 4 c# task-parallel-library

考虑这个Task.Run例子.它显示了如何创建具有取消支持的任务.

我正在做类似的事情:

Task.Run(()=>{while (!token.IsCancellationRequested()) {...}}, token);
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 既然我已经有了对取消令牌的引用,为什么将它作为参数传递给Task.Run调用呢?

  2. 我经常在示例中看到以下代码:

    if (token.IsCancellationRequested) token.ThrowIfCancellationRequested();

这段代码的目的是什么?为什么不return从方法?

Sri*_*vel 7

  1. 如果您将取消令牌传递给Task.Run,如果在启动任务之前取消令牌,则永远不会启动它来保存资源(我的意思是不创建线程等).

  2. 如果你只是从方法返回,任务的状态将不会Canceled,它将是RanToCompletion.显然,这不是你所期望的.

或者你可以OperationCanceledException使用CancellationTokenas参数抛出,这将使得它Task.Status成为Canceled,但这是艰难而冗长的方式.token.ThrowIfCancellationRequested很简洁.

你可以简单地使用token.ThrowIfCancellationRequested();,无需检查token.IsCancellationRequested.ThrowIfCancellationRequested方法已经这样做了.

  • @MatthiasMüller好问题.但取消不是正常的控制流程吗?这意味着您对已启动的任务不感兴趣.BCL的设计者选择使用例外来实现取消.就像你去酒店一样,订购了需要很长时间服务的东西,你不能再等了,并且说*我不再需要那个废话了.取消它!*因为这不是通常的事情,他们选择使用例外是我的猜测.否则,您需要标记,如果存在嵌套方法调用,则无法轻松处理.你能明白我的意思吗? (3认同)