什么是TaskFactory.StartNew()中的“cancellationToken”用于?

http://msdn.microsoft.com/en-us/library/dd988458.aspx

UPD

所以,让我们讨论这篇文章: http : //msdn.microsoft.com/en-us/library/dd997396.aspx

我已经改变了一点代码:

static void Main() { var tokenSource2 = new CancellationTokenSource(); CancellationToken ct = tokenSource2.Token; var task = Task.Factory.StartNew(() => { // Were we already canceled? ct.ThrowIfCancellationRequested(); bool moreToDo = true; Thread.Sleep(5000); while (moreToDo) { // Poll on this property if you have to do // other cleanup before throwing. if (ct.IsCancellationRequested) { Console.WriteLine("exit"); // Clean up here, then... ct.ThrowIfCancellationRequested(); } } }, tokenSource2.Token); // this parameter useless Console.WriteLine("sleep"); Thread.Sleep(2000); Console.WriteLine("cancel"); tokenSource2.Cancel(); // Just continue on this thread, or Wait/WaitAll with try-catch: try { task.Wait(); } catch (AggregateException e) { foreach (var v in e.InnerExceptions) { Console.WriteLine(e.Message + " " + v.Message); } } Console.ReadKey(); } 

UPD :嗯,这只会改变task.IsCanceled 。因为我仍然应该手动实现所有,因此无法使用。

由于评论,我发布了另一个答案。

请考虑以下代码:

 var tokenSource = new CancellationTokenSource(); CancellationToken ct = tokenSource.Token; tokenSource.Cancel(); var task = Task.Factory.StartNew(() => { // Were we already canceled? ct.ThrowIfCancellationRequested(); // do some processing }); 

即使在实际启动任务之前发出调用tokenSource.Cancel() ,您仍将从线程池中分配工作线程,因此您将浪费一些系统资源。

但是当您在Task.Factory.StartNew指定令牌参数时,该任务将立即被取消,而不会分配工作线程。

使用任务取消仍然是合作的。 你不希望在一些关键操作中杀死一个线程。 你需要检查一下。

CancellationTokens比简单的构造(如ManualResetEvent更好地用于信号关闭操作,因为您可以级联或组合它们,例如,您可以有一个用于整个应用程序关闭,您可以将它与一个用于取消特定任务。 该任务只需查看一个CancellationToken但您可以从CancellationTokenSource取消它。