欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Parallel Programming-使用CancellationTokenSource调度并行运行的Task

发布时间:2025/4/14 编程问答 54 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Parallel Programming-使用CancellationTokenSource调度并行运行的Task 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

本文主要介绍使用CancellationTokenSource调度并行运行的Task。

一、使用场景

有多个Task并行运行时,如果其中一个Task所运行的程序出现异常,我们想马上终止所有待执行的Task。这样对系统的性能等各个方面都是有好处的。

二、源码

2.1 被多线程执行的代码

public class Handler{public void DoSomething(CancellationTokenSource cts, int index){if (cts.IsCancellationRequested){return;}if (index == 2){cts.Cancel();}Console.WriteLine(index);}}

两点:

  • 判断cts是否已经取消,如果取消则不再执行。
  • index的=2的时候取消cts。这样其他在此之后的Task再执行进来的时候IsCancellationRequested就是true。不会再执行。
  • 2.2 Task调度代码

    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)

    2.3 Task.ContinueWith

    foreach (var task in childTasks) {task.ContinueWith(t => cts.Cancel(), TaskContinuationOptions.OnlyOnFaulted); }

    这块代码的主要含义是当task发生错误,比如抛出异常的时候,对cts发起取消。这样cts处于取消状态后(IsCancellationRequested==true),后续的操作都会直接return,不再执行。

    这就回到了本文开始的话题:有多个Task并行运行时,如果其中一个Task所运行的程序出现异常,我们想马上终止所有待执行的Task。这样对系统的性能等各个方面都是有好处的。

    并行编程打算写一个系列的文章好好总结一下。

    转载于:https://www.cnblogs.com/Brake/p/Parallel_Programming_Coodinate_Multi_Task_By_CancellationTokenSource.html

    总结

    以上是生活随笔为你收集整理的Parallel Programming-使用CancellationTokenSource调度并行运行的Task的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。