訊號量的使用 ManualResetEvent

鵬飛萬里發表於2018-09-07

執行緒的等待時可以用這個,不論是執行緒池還是執行緒都可以用這個做等待。


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("我吃了!");

相關文章