C#使用AutoResetEvent實現同步

簡介

AutoResetEvent(boolinitialState):構造函數,用一個指示是否將初始狀態設置爲終止的布爾值初始化該類的新實例。
   false:無信號,子線程的WaitOne方法不會被自動調用
   true:有信號,子線程的WaitOne方法會被自動調用
 Reset ():將事件狀態設置爲非終止狀態,導致線程阻止;如果該操作成功,則返回true;否則,返回false。
 Set():將事件狀態設置爲終止狀態,允許一個或多個等待線程繼續;如果該操作成功,則返回true;否則,返回false。
 WaitOne(): 阻止當前線程,直到收到信號。
 WaitOne(TimeSpan, Boolean) :阻止當前線程,直到當前實例收到信號,使用 TimeSpan度量時間間隔並指定是否在等待之前退出同步域。   
   WaitAll():等待全部信號。

 

實現

 class Program

 {


  static void Main()

  {

   Request req = newRequest();


  //這個人去幹三件大事 

   Thread GetCarThread = newThread(new ThreadStart(req.InterfaceA));

   GetCarThread.Start();


   Thread GetHouseThead = newThread(new ThreadStart(req.InterfaceB));

   GetHouseThead.Start();


  //等待三件事都幹成的喜訊通知信息 

  AutoResetEvent.WaitAll(req.autoEvents);


  //這個人就開心了。 

   req.InterfaceC();


   System.Console.ReadKey();

  }

 }


 public class Request

 {

  //建立事件數組 

  public AutoResetEvent[] autoEvents = null;


  public Request()

  {

   autoEvents = newAutoResetEvent[]

   {

    newAutoResetEvent(false),

    new AutoResetEvent(false)

   };

  }


  public void InterfaceA()

  {

  System.Console.WriteLine("請求A接口");


   Thread.Sleep(1000*2);


   autoEvents[0].Set();


  System.Console.WriteLine("A接口完成");

  }


  public void InterfaceB()

  {

  System.Console.WriteLine("請求B接口");


   Thread.Sleep(1000 * 1);


   autoEvents[1].Set();


  System.Console.WriteLine("B接口完成");

  }


  public void InterfaceC()

  {

  System.Console.WriteLine("兩個接口都已經請求完,正在處理C");

  }

 }


發佈了53 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章