具有取消支持的Task.Run

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

我正在做类似的事情:

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

我的问题:

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

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

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

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

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

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

或者,您可以使用CancellationToken作为参数抛出OperationCanceledException ,这将使Task.StatusCanceled ,但这是一种艰难而冗长的方式。 token.ThrowIfCancellationRequested简洁明了。

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