執行緒的等待時可以用這個,不論是執行緒池還是執行緒都可以用這個做等待。
ManualResetEvent md=new ManualResetEvent(false);//這個false 設定執行緒等待, true 允許執行緒不待等
IAsyncResult result= new Action<string>((t) =>
{
Console.WriteLine(t);
mre.Set();//允許執行緒不用繼續等待,可以執行下去
}).BeginInvoke("你好",null,null);
mre.WaitOne();//主執行緒被卡在這裡,等待訊號量變成true(mre.Set()這個方法後就可變為true不用等待)
Console.WriteLine("你吃飯了麼!");
mre.Reset();//重新設為執行緒等待
IAsyncResult result01= new Action<string>((t) =>
{
Console.WriteLine(t);
mre.Set();//設定執行緒不用繼續等待,可以執行下去
}).BeginInvoke("還沒吃",null,null);
mre.WaitOne();//又被阻塞了
Console.WriteLine("一起吃飯吧!");
//輸出結果
你好
你吃飯了麼!
還沒吃
一起吃飯吧!
//執行緒池中的使用
mre.Reset();
ThreadPool.QueueUserWorkItem((t) =>
{
Console.WriteLine("我是從執行緒池中走出的執行緒!");
mre.Set();
});
mre.WaitOne();
當然也可以用迴圈待等的執行的方式進行執行緒待等
while (!result.IsCompleted)
{
Thread.Sleep(500);
Console.WriteLine("我在等你回覆!");
}
Console.WriteLine("我吃了!");