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种阻塞的主要内容,如果未能解决你的问题,请参考以下文章