C#嵌套任务和子任务

简介:   任务嵌套就是指在一个任务中又创建了一个任务,而这个新建的任务,就被称为子任务。在没有特殊声明的情况下,父子任务是一起运行的,如SimpleNestedTask方法。  如果想让父子任务关联起来的话,需要在创建子任务的时候,增加参数TaskCreationOptions.AttachedToParent,将父子任务关联起来,这样父任务将等待子任务完成,才会完成。

  任务嵌套就是指在一个任务中又创建了一个任务,而这个新建的任务,就被称为子任务。在没有特殊声明的情况下,父子任务是一起运行的,如SimpleNestedTask方法。
  如果想让父子任务关联起来的话,需要在创建子任务的时候,增加参数TaskCreationOptions.AttachedToParent,将父子任务关联起来,这样父任务将等待子任务完成,才会完成。
  如果使用Task<TResult>创建任务的话,这不需要使用TaskCreationOptions.AttachedToParent参数了,因为只要父任务使用了子任务的返回结果,父任务自然就会等待子任务完成。

 public class Program
    {
        static void Main(string[] args)
        { 
            WaitForSimpleNestedTask();
            Console.WriteLine("=====================================================");
            SimpleNestedTask();
            Thread.SpinWait(600000);//等待SimpleNestedTask结束 再运行
            Console.WriteLine("=====================================================");
            //SimpleNestedTaskAttachedToParent();
            Console.Read();
        }
        static void WaitForSimpleNestedTask()
        {
            var outer = Task<int>.Factory.StartNew(() =>
            {
                Console.WriteLine("Outer1 task executing.");

                var nested = Task<int>.Factory.StartNew(() =>
                {
                    Console.WriteLine("Nested1 task starting.");
                    Thread.SpinWait(5000000);
                    Console.WriteLine("Nested1 task completing.");
                    return 42;
                });

                // 父任务等待子任务完成
                return nested.Result;
                // 父任务不等待子任务完成
                //return 1;
            });
            //输出的时候使用了返回值outer.Result,所以自动等待父任务完成
            Console.WriteLine("Outer1 has returned {0}.", outer.Result);
        }
        static void SimpleNestedTask()
        {
            var parent = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Outer2 task executing.");

                var child = Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Nested2 task starting.");
                    Thread.SpinWait(500000);
                    Console.WriteLine("Nested2 task completing.");
                });
            });
            //等待父任务完成,再输出字符串,如果没有这个等待,这句话会先输出
            parent.Wait();
            Console.WriteLine("Outer2 has completed."); 
        }

        static void SimpleNestedTaskAttachedToParent()
        {
            var parent = Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Outer3 task executing.");

                var child = Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("Nested3 task starting.");
                    Thread.SpinWait(500000);
                    Console.WriteLine("Nested3 task completing.");
                }, TaskCreationOptions.AttachedToParent);
                //增加参数TaskCreationOptions.AttachedToParent,将子任务附加进父任务,这样子任务完成后,父任务才算完成。
            });
            
            //等待父任务完成,再输出字符串,如果没有这个等待,这句话会先输出
            parent.Wait();
            Console.WriteLine("Outer has completed.");
        }
View Code

 

目录
相关文章
|
18天前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
44 3
|
7月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
|
SQL 开发框架 算法
C#多线程开发-任务并行库04
C#多线程开发-任务并行库04
149 0
C#多线程开发-任务并行库04
|
API C#
C#多线程(14):任务基础②
C#多线程(14):任务基础②
204 0
C#多线程(14):任务基础②
|
存储 API C#
C#多线程(15):任务基础③
任务基础一共三篇,本篇是第三篇,之后开始学习异步编程、并发、异步I/O的知识。 本篇会继续讲述 Task 的一些 API 和常用的操作。
171 0
|
监控 安全 Java
C#多线程(13):任务基础①
C#多线程(13):任务基础①
159 0
|
存储 安全 Java
C# 之 异步多线程任务相关以及概念使用介绍
C#异步多线程Task的介绍和使用,从相关关键字到使用示例,详细解析Task和TaskCompletionSource的使用方法。
507 0
C# 之 异步多线程任务相关以及概念使用介绍
⭐️C# 零基础到进阶⭐️| 字典和列表 相互嵌套使用 的终极总结!
字典和列表 相互嵌套 📢前言 🏳️‍🌈字典 字典嵌套字典 字典嵌套列表 🏳️‍🌈列表 列表嵌套列表 列表嵌套字典 👥总结