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