Task.Run 支持取消

Task.Run with cancellation support

考虑 this Task.Run example。它展示了如何创建具有取消支持的任务。

我正在做类似的事情:

Task.Run(()=>{while (!token.IsCancellationRequested()) {...}}, token);

我的问题:

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

  2. 经常在例子中看到如下代码:

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

这段代码的用途是什么?为什么不直接从方法中 return

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

  2. 如果您只是从方法中 return,任务的状态将不会是 Canceled,而是 RanToCompletion。显然这不是您所期望的。

或者,您可以将 CancellationToken 作为参数抛出 OperationCanceledException,这将使 Task.Status 变为 Canceled,但这是一种困难且冗长的方法。 token.ThrowIfCancellationRequested 简洁。

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