Intro
C# 執行緒等候其它作業的方式
System.Threading.Thread.Join System.Threading.EventWaitHandle extend System.Threading.WaitHandle //不提, 被 AutoResetEvent 及 ManualResetEvent 實作 System.Threading.AutoResetEvent exnted System.Threading.EventWaitHandle System.Threading.ManualResetEvent extend System.Threading.EventWaitHandle System.Threading.CountdownEvent
以上介紹為等待作業的方式
另一種實作方法是鎖定作業 C# Thread Monitor 鎖定作業
也可用 delegate or event 來取代等候作業
依看倌們喜歡的設計方式
Content
Thread.Join
等待特定thread "完成" or "結束"
static void Main(string[] args) { var thd1 = new Thread(delegate() { Console.WriteLine("Start thd1"); Thread.Sleep(1000); Console.WriteLine("End thd1"); }); var thd2 = new Thread(delegate() { Console.WriteLine("Start thd2"); Console.WriteLine("Wait..."); thd1.Join();//重點-thd1做完才會接thd2 Console.WriteLine("End thd2"); }); thd1.Start(); thd2.Start(); Console.ReadKey(); }
ManualResetEvent
以下功能與Join類似
但可以在任意時間點告知thd2可以繼續了
有多個thread要確認的話, 可以用個陣列記錄
static ManualResetEvent mre = new ManualResetEvent(false); static void Main(string[] args) { mre.Reset();//設為false, 等待訊號中 var thd1 = new Thread(delegate() { Console.WriteLine("Start thd1"); Thread.Sleep(1000); Console.WriteLine("End thd1"); mre.Set();//告知thd2可以繼續作業了 }); var thd2 = new Thread(delegate() { Console.WriteLine("Start thd2"); Console.WriteLine("Wait..."); mre.WaitOne();//等待thd1告知繼續作業 Console.WriteLine("End thd2"); }); thd1.Start(); thd2.Start(); Console.ReadKey(); }
AutoResetEvent
以下功能與ManualResetEvent類似
只差在它會自動Reset
就像收費站一樣, 一次過一輛車, 每次自動Reset
static AutoResetEvent mre = new AutoResetEvent(false); static void Main(string[] args) { var thd1 = new Thread(delegate() { Console.WriteLine("Start thd1"); Thread.Sleep(1000); mre.Set(); Thread.Sleep(1000); mre.Set(); Console.WriteLine("End thd1"); }); var thd2 = new Thread(delegate() { Console.WriteLine("Start thd2"); Console.WriteLine("Wait...first"); mre.WaitOne(); Console.WriteLine("Wait...second"); mre.WaitOne(); Console.WriteLine("End thd2"); }); thd1.Start(); thd2.Start(); Console.ReadKey(); }
CountdownEvent
以計數的方式來等候其它作業, 初始
static CountdownEvent cde = new CountdownEvent(2); static void Main(string[] args) { var thd1 = new Thread(delegate() { Console.WriteLine("Start thd1"); Thread.Sleep(1000); cde.Signal(); Console.WriteLine("thd1 - signal"); Thread.Sleep(1000); cde.Signal(); Console.WriteLine("End thd1"); }); var thd2 = new Thread(delegate() { Console.WriteLine("Start thd2"); Console.WriteLine("Wait..."); cde.Wait(); Console.WriteLine("End thd2"); }); thd1.Start(); thd2.Start(); Console.ReadKey(); }
沒有留言:
張貼留言