網頁

2015年11月24日 星期二

C# Thread 等候其它作業

Last Update: 2015/11/24 18:55+08



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();
}

沒有留言:

張貼留言