Task.Factory.StartNew()的第二个参数有什么用?

时间:2018-02-22 22:50:38

标签: c# multithreading task

C#方法Task.Factory.StartNew将可选的取消令牌作为第二个参数。在下面的示例代码中,我已经包含了这个论点。我不能得到的是,如果不包含第二个参数,代码仍然有效。显然,即使它没有作为参数传递,该操作也可以访问该令牌。那么传递它作为一个论点的目的是什么?是否存在需要第二个参数的情况,或者微软是否完全没有必要包含此选项?

var cts = new CancellationTokenSource();
var token = cts.Token;
Task.Factory.StartNew(() =>
{
    int i = 0;
    while (true)
    {
        token.ThrowIfCancellationRequested();
        Console.WriteLine($"{i++}\t");
        Thread.Sleep(500);
    }
}, token);
Console.ReadKey();
cts.Cancel();

2 个答案:

答案 0 :(得分:1)

仅在取消令牌在任务开始执行之前被取消的情况下才有用。如果发生这种情况,那么该任务将永远不会被执行,并将直接标记为已取消,从而节省了一些资源。

答案 1 :(得分:0)

由于stackoverflow低点策略无法发表评论所以写在这里。这个问题在Why does TaskFactory.StartNew receive a CancellationToken中得到了很好的回答,这也恰好是另一个问题的重复。