Task.Run 支持取消
Task.Run with cancellation support
考虑 this Task.Run
example。它展示了如何创建具有取消支持的任务。
我正在做类似的事情:
Task.Run(()=>{while (!token.IsCancellationRequested()) {...}}, token);
我的问题:
既然我已经有了对取消令牌的引用,为什么还要将它作为参数传递给 Task.Run
调用?
经常在例子中看到如下代码:
if (token.IsCancellationRequested) token.ThrowIfCancellationRequested();
这段代码的用途是什么?为什么不直接从方法中 return
?
如果您将取消令牌传递给 Task.Run
,如果令牌在任务启动之前被取消,它将永远不会启动以节省您的资源(我的意思是不创建线程等).
如果您只是从方法中 return,任务的状态将不会是 Canceled
,而是 RanToCompletion
。显然这不是您所期望的。
或者,您可以将 CancellationToken
作为参数抛出 OperationCanceledException
,这将使 Task.Status
变为 Canceled
,但这是一种困难且冗长的方法。 token.ThrowIfCancellationRequested
简洁。
您可以简单地使用 token.ThrowIfCancellationRequested();
,无需检查 token.IsCancellationRequested
。 ThrowIfCancellationRequested
方法已经这样做了。
考虑 this Task.Run
example。它展示了如何创建具有取消支持的任务。
我正在做类似的事情:
Task.Run(()=>{while (!token.IsCancellationRequested()) {...}}, token);
我的问题:
既然我已经有了对取消令牌的引用,为什么还要将它作为参数传递给
Task.Run
调用?经常在例子中看到如下代码:
if (token.IsCancellationRequested) token.ThrowIfCancellationRequested();
这段代码的用途是什么?为什么不直接从方法中 return
?
如果您将取消令牌传递给
Task.Run
,如果令牌在任务启动之前被取消,它将永远不会启动以节省您的资源(我的意思是不创建线程等).如果您只是从方法中 return,任务的状态将不会是
Canceled
,而是RanToCompletion
。显然这不是您所期望的。
或者,您可以将 CancellationToken
作为参数抛出 OperationCanceledException
,这将使 Task.Status
变为 Canceled
,但这是一种困难且冗长的方法。 token.ThrowIfCancellationRequested
简洁。
您可以简单地使用 token.ThrowIfCancellationRequested();
,无需检查 token.IsCancellationRequested
。 ThrowIfCancellationRequested
方法已经这样做了。