C#使用Task.ContinueWith组合任务
代码案例
简单Demo
代码:
public static void Main(){//创建一个任务Tasktask = new Task (() =>{int sum = 0; Console.WriteLine("使用Task異步執行操作."); for (int i = 0; i <= 100; i++){sum += i; }return sum; }); //启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)task.Start(); Console.WriteLine("主線程執行其他程序."); //任务完成时执行处理。Task cwt = task.ContinueWith(t =>{Console.WriteLine("任務完成後的結果是:{0}", t.Result.ToString()); }); task.Wait(); cwt.Wait(); Console.ReadLine(); Console.ReadKey(); }
结果:
文章图片
任务的串行
代码:
static void Main(string[] args){ConcurrentStackstack = new ConcurrentStack (); //t1先串行var t1 = Task.Factory.StartNew(() =>{//入棧stack.Push(1); stack.Push(2); }); //t2,t3并行执行var t2 = t1.ContinueWith(t =>{int result; //出棧stack.TryPop(out result); Console.WriteLine("Task t2 result={0},Thread id {1}", result, Thread.CurrentThread.ManagedThreadId); }); //t2,t3并行执行var t3 = t1.ContinueWith(t =>{int result; //出棧stack.TryPop(out result); Console.WriteLine("Task t3 result={0},Thread id {1}", result, Thread.CurrentThread.ManagedThreadId); }); //等待t2和t3执行完Task.WaitAll(t2, t3); //t7串行执行var t4 = Task.Factory.StartNew(() =>{Console.WriteLine("當前的集合數目:{0},Thread id {1}", stack.Count, Thread.CurrentThread.ManagedThreadId); }); t4.Wait(); Console.ReadKey(); }
结果:
【C#使用Task.ContinueWith组合任务】
文章图片
子任务
代码:
public static void Main(){Task parent = new Task(state =>{Console.WriteLine(state); string[] result = new string[2]; //创建并启动子任务new Task(() => { result[0] = "我是子任務1。"; }, TaskCreationOptions.AttachedToParent).Start(); new Task(() => { result[1] = "我是子任務2。"; }, TaskCreationOptions.AttachedToParent).Start(); return result; }, "我是父任務,並在處理過程中創建多個子任務,所有的子任務完成以後我才會開始執行。"); //任务处理完成后执行的操作parent.ContinueWith(t =>{Array.ForEach(t.Result, r => Console.WriteLine(r)); }); //启动父任务parent.Start(); //等待任务结束 Wait只能等待父线程结束,没办法等到父线程的ContinueWith结束//parent.Wait(); Console.ReadLine(); }
结果:
文章图片
动态并行
代码:
class Node{public Node Left { get; set; }public Node Right { get; set; }public string Text { get; set; }}class Program{static Node GetNode(){Node root = new Node{Left = new Node{Left = new Node{Text = "L-L"},Right = new Node{Text = "L-R"},Text = "L"},Right = new Node{Left = new Node{Text = "R-L"},Right = new Node{Text = "R-R"},Text = "R"},Text = "Root"}; return root; }static void Main(string[] args){Node root = GetNode(); DisplayTree(root); }static void DisplayTree(Node root){var task = Task.Factory.StartNew(() => DisplayNode(root),CancellationToken.None,TaskCreationOptions.None,TaskScheduler.Default); task.Wait(); }static void DisplayNode(Node current){if (current.Left != null)Task.Factory.StartNew(() => DisplayNode(current.Left),CancellationToken.None,TaskCreationOptions.AttachedToParent,TaskScheduler.Default); if (current.Right != null)Task.Factory.StartNew(() => DisplayNode(current.Right),CancellationToken.None,TaskCreationOptions.AttachedToParent,TaskScheduler.Default); Console.WriteLine("當前節點值:{0}; 處理的Thread ID ={1}", current.Text, Thread.CurrentThread.ManagedThreadId); }}
结果:
文章图片
到此这篇关于C#使用Task.ContinueWith组合任务的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- Spring|Spring Boot 集成PageHelper的使用方法
- 2022年要使用的7种最佳数据分析工具合集
- 最值得使用的10个最佳Java框架合集
- 仅仅需一步教你解决Win10下Android Studio terminal无法使用的问题
- DB2检查数据库授权
- DB2 RazorSQL备份
- 操作系统|为什么计算机专业的学生要学习使用 Linux 系统()
- Android开发之WebView的开发使用(源码分享)
- Android Studio引用第三方jar包(例如(使用LitePal))
- 什么是数据立方体()