AutoResetEvent 允許線程通過發(fā)信號(hào)互相通信。通常,,此通信涉及線程需要獨(dú)占訪問的資源,。 線程通過調(diào)用 AutoResetEvent 上的 WaitOne 來等待信號(hào)。如果 AutoResetEvent 處于非終止?fàn)顟B(tài),,則該線程阻塞,,并等待當(dāng)前控制資源的線程 調(diào)用 Set 向 AutoResetEvent 發(fā)信號(hào)以釋放等待線程,。AutoResetEvent 將保持終止?fàn)顟B(tài),,直到一個(gè)正在等待的線程被釋放,然后自動(dòng)返回非終止?fàn)顟B(tài),。如果沒有任何線程在等待,,則狀態(tài)將無限期地保持為終止?fàn)顟B(tài),。 可以通過將一個(gè)布爾值傳遞給構(gòu)造函數(shù)來控制 AutoResetEvent 的初始狀態(tài),如果初始狀態(tài)為終止?fàn)顟B(tài),,則為 true,;否則為 false。 通俗的來講只有等myResetEven.Set()成功運(yùn)行后,myResetEven.WaitOne()才能夠獲得運(yùn)行機(jī)會(huì);Set是發(fā)信號(hào),,WaitOne是等待信號(hào),,只有發(fā)了信號(hào), using System; using System.Linq; using System.Activities; using System.Activities.Statements; using System.Threading; namespace CaryAREDemo { class Me { const int numIterations = 550; static AutoResetEvent myResetEvent = new AutoResetEvent(false); static AutoResetEvent ChangeEvent = new AutoResetEvent(false); //static ManualResetEvent myResetEvent = new ManualResetEvent(false); //static ManualResetEvent ChangeEvent = new ManualResetEvent(false); static int number; //這是關(guān)鍵資源 static void Main() { Thread payMoneyThread = new Thread(new ThreadStart(PayMoneyProc)); payMoneyThread.Name = "付錢線程"; Thread getBookThread = new Thread(new ThreadStart(GetBookProc)); getBookThread.Name = "取書線程"; payMoneyThread.Start(); getBookThread.Start(); for (int i = 1; i <= numIterations; i++) { Console.WriteLine("買書線程:數(shù)量{0}", i); number = i; //Signal that a value has been written. myResetEvent.Set(); ChangeEvent.Set(); Thread.Sleep(0); } payMoneyThread.Abort(); getBookThread.Abort(); } static void PayMoneyProc() { while (true) { myResetEvent.WaitOne(); //myResetEvent.Reset(); Console.WriteLine("{0}:數(shù)量{1}", Thread.CurrentThread.Name, number); } } static void GetBookProc() { while (true) { ChangeEvent.WaitOne(); // ChangeEvent.Reset(); Console.WriteLine("{0}:數(shù)量{1}", Thread.CurrentThread.Name, number); Console.WriteLine("------------------------------------------"); Thread.Sleep(0); } } } } 運(yùn)行結(jié)果如下: AutoResetEvent與ManualResetEvent的區(qū)別 他們的用法\聲明都很類似,,Set方法將信號(hào)置為發(fā)送狀態(tài) Reset方法將信號(hào)置為不發(fā)送狀態(tài)WaitOne等待信號(hào)的發(fā)送。其實(shí),從名字就可以看出一個(gè)手動(dòng), public AutoResetEvent autoevent=new AutoResetEvent(true); 默認(rèn)信號(hào)都處于發(fā)送狀態(tài), autoevent.WaitOne(); 如果 某個(gè)線程調(diào)用上面該方法,則當(dāng)信號(hào)處于發(fā)送狀態(tài)時(shí),該線程會(huì)得到信號(hào),得以繼續(xù)執(zhí)行,。差別就在調(diào)用后,autoevent.WaitOne()每次只允許一個(gè)線程 |
|