2 Task中的延续和7种阻塞

Posted wholeworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2 Task中的延续和7种阻塞相关的知识,希望对你有一定的参考价值。

1.wait

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多线程_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延续和7种阻塞
            //阻塞 wait  有点像thread的join 作用是Task执行完 这个wait之后的代码才可以执行
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait");
            });
            t1.Start();
            t1.Wait();
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }
        
    }
}

2.WaitAll

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多线程_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延续和7种阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();

            Task.WaitAll(t1, t2);
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }
        
    }
}

先输出  我是wait2 再输出 我是wait1  最后输出 我是主线程

3.WaitAny

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多线程_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延续和7种阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();

            Task.WaitAny(t1, t2);
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }
        
    }
}

先输出  我是wait2 再输出 我是主线程  最后输出 我是wait1 

4 whenAll +延续

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多线程_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延续和7种阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();

            Task.WhenAll(t2, t1).ContinueWith(t3=> {
                Console.WriteLine("我是t3,一个新的线程");
            });
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }
        
    }
}

我是主线程

我是wait2
我是wait1
我是t3,一个新的线程

5 whenAny +延续

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多线程_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延续和7种阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //跟上一个代码的区别是  上一个是whenAll 这个是whenAny
            Task.WhenAny(t2, t1).ContinueWith(t3=> {
                Console.WriteLine("我是t3,一个新的线程");
            });
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }
        
    }
}

我是主线程
我是wait2
我是t3,一个新的线程
我是wait1

6 Task.Factory的whenAll阻塞和延续

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多线程_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延续和7种阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //注意的是 这里是factory  上面两个线程也要start
            Task.Factory.ContinueWhenAll(new Task[2] { t1, t2 }, t =>
            {
                Console.WriteLine("factory 中的when All");
            });
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }
        
    }
}

我是主线程
我是wait2
我是wait1
factory 中的when All

7 Task.Factory的whenAny阻塞和延续

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多线程_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延续和7种阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //注意的是 这里是factory  上面两个线程也要start
            Task.Factory.ContinueWhenAny(new Task[2] { t1, t2 }, t =>
            {
                Console.WriteLine("factory 中的when Any");
            });
            Console.WriteLine("我是主线程");
            Console.ReadKey();

        }
        
    }
}

我是主线程
我是wait2
factory 中的when Any
我是wait1

 












以上是关于2 Task中的延续和7种阻塞的主要内容,如果未能解决你的问题,请参考以下文章

C# 理解阻塞 UI 和异步/等待与 Task.Run 的问题?

C# Task用法详解

C#多线程和异步——Task和async/await详解

在systemverilog的task中只能用阻塞赋值么

聊聊多线程那一些事儿(task)之 三 异步取消和异步方法

IFE_part1(task1-7)_blog.html总结