本文主要介紹使用CancellationTokenSource調度並行運行的Task。
有多個Task並行運行時,如果其中一個Task所運行的程序出現異常,我們想馬上終止所有待執行的Task。這樣對系統的性能等各個方面都是有好處的。
public class Handler
{
public void DoSomething(CancellationTokenSource cts, int index)
{
if (cts.IsCancellationRequested)
{
return;
}
if (index == 2)
{
cts.Cancel();
}
Console.WriteLine(index);
}
}
兩點:
public class AppClient
{
public static void Main()
{
var cts = new CancellationTokenSource();
var childTasks = new List<Task>();
var parentTask = new Task(() =>
{
var taskFactory = new TaskFactory(cts.Token, TaskCreationOptions.AttachedToParent,
TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);
for (var i = 0; i < 100; i++)
{
var tempIndex = i;
var childTask = taskFactory.StartNew(() => new Handler().DoSomething(cts, tempIndex));
childTasks.Add(childTask);
}
foreach (var task in childTasks)
{
task.ContinueWith(t => cts.Cancel(), TaskContinuationOptions.OnlyOnFaulted);
}
});
parentTask.Start();
parentTask.Wait();
Console.Read();
}
}
上面的代碼在正常情況下會有100個Task產生,會Attach到父Task上,由父Task統一調度(parentTask.Start; parentTask.Wait)
foreach (var task in childTasks)
{
task.ContinueWith(t => cts.Cancel(), TaskContinuationOptions.OnlyOnFaulted);
}
這塊代碼的主要含義是當task發生錯誤,比如拋出異常的時候,對cts發起取消。這樣cts處於取消狀態後(IsCancellationRequested==true),後續的操作都會直接return,不再執行。
這就回到了本文開始的話題:有多個Task並行運行時,如果其中一個Task所運行的程序出現異常,我們想馬上終止所有待執行的Task。這樣對系統的性能等各個方面都是有好處的。
並行編程打算寫一個系列的文章好好總結一下。