伙计们,我曾经使用像Task.Factory.StartNew(new Action(()=>{}), cancellationToken);
我对第二个参数cancellationToken
有疑问。因为cancellationToken
是我方法中的变量,所以在lambda表达式中,我可以像使用msdn一样使用字段取消我的任务;我不确定这是推荐的。在这种情况下,这里需要的第二个参数是什么?它在StartNew方法中传递,但实际上没有使用。我们需要使用这个参数吗?
答案 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://msdn.microsoft.com/en-us/library/ff963549.aspx有待进一步讨论。