具有取消支持的Task.Run

时间:2015-02-17 08:21:29

标签: c# task-parallel-library

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

我正在做类似的事情:

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

我的问题:

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

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

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

  3. 此代码的目的是什么?为什么不只是方法中的return

1 个答案:

答案 0 :(得分:7)

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

  2. 如果您刚从该方法返回,则任务的状态将不是Canceled,而是RanToCompletion。显然,这不是你所期望的。

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

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