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();
}
沒有留言:
張貼留言