本文主要介绍使用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。这样对系统的性能等各个方面都是有好处的。
并行编程打算写一个系列的文章好好总结一下。
新闻热点
疑难解答