具有取消支持的Task.Run
考虑一下这个Task.Run
示例 。 它显示了如何创建具有取消支持的任务。
我正在做类似的事情:
Task.Run(()=>{while (!token.IsCancellationRequested()) {...}}, token);
我的问题:
-
由于我已经有了对取消令牌的引用,为什么将它作为参数传递给
Task.Run
调用呢? -
我经常在示例中看到以下代码:
if (token.IsCancellationRequested) token.ThrowIfCancellationRequested();
这段代码的目的是什么? 为什么不从方法return
?
-
如果将取消令牌传递给
Task.Run
,如果在启动任务之前取消令牌,则永远不会启动它来保存资源(我的意思是不创建线程等)。 -
如果你只是从方法返回,任务的状态将不会被
Canceled
,它将是RanToCompletion
。 显然,这不是你所期望的。
或者,您可以使用CancellationToken
作为参数抛出OperationCanceledException
,这将使Task.Status
被Canceled
,但这是一种艰难而冗长的方式。 token.ThrowIfCancellationRequested
简洁明了。
你可以简单地使用token.ThrowIfCancellationRequested();
,无需检查token.IsCancellationRequested
。 ThrowIfCancellationRequested
方法已经这样做了。