2 Task中的延續和7種阻塞
阿新 • • 發佈:2018-12-29
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