关于使用Task的参数的问题

时间:2011-04-12 03:21:42

标签: .net .net-4.0 parallel-processing

伙计们,我曾经使用像Task.Factory.StartNew(new Action(()=>{}), cancellationToken);

这样的方法

我对第二个参数cancellationToken有疑问。因为cancellationToken是我方法中的变量,所以在lambda表达式中,我可以像使用msdn一样使用字段取消我的任务;我不确定这是推荐的。在这种情况下,这里需要的第二个参数是什么?它在StartNew方法中传递,但实际上没有使用。我们需要使用这个参数吗?

1 个答案:

答案 0 :(得分:2)

如果要取消任务,则需要此参数。如果您的申请不支持或要求取消,那么您可以说

Task.Factory.StartNew(() => { ... });

请注意,取消是合作的,因此您的代码必须轮询取消并做出相应的响应。

例如:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

Task myTask = Task.Factory.StartNew(() =>
    {
        for (...)
        {
            token.ThrowIfCancellationRequested();

            // Body of for loop.
        }
    }, token);

    // ... elsewhere ...
    cts.Cancel();

您必须将取消令牌传递给方法,否则它不会附加到任务。方法中的代码仅使用令牌来响应取消,无论是抛出还是使用IsCancellationRequested来关闭。虽然任务可以从lambda内取消,我猜。任务本身也需要令牌。

这里有一些进一步的澄清:

  

将令牌传递到StartNew   将令牌与任务相关联。   这有两个主要好处:1)如果   令牌已取消请求   在任务开始执行之前,   任务将不会执行。而不是   过渡到跑步,它会   立即过渡到已取消。   这避免了运行的成本   任务,如果它只是被取消   无论如何都要跑步。 2)如果身体   任务也在监控   取消令牌并抛出一个   包含OperationCanceledException   那个令牌(这是什么   ThrowIfCancellationRequested确实),   然后当任务看到OCE时,它   检查OCE的令牌是否匹配   任务的令牌。如果确实如此,那   异常被视为一个   承认合作社   取消和任务转换   到取消状态(而不是   故障状态)。

来自http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/c2f614f6-c96c-4821-84cc-050b21aaee45

请参阅此处取消的一般性讨论:

http://msdn.microsoft.com/en-us/library/ff963549.aspx有待进一步讨论。