2012-01-25 56 views
1

早上好。採取這種簡單的方案:我有一個NetClient連接到遠程服務器,使用無效方法Connect();完成後,NetClient上升Connected事件。使同步成爲無效的方法,上升事件,返回事件參數

我需要這個NetClient換到無法管理這樣的異步邏輯另一呼叫者:這個調用者想要同步Connect()方法,如果確定(爲簡單起見,不考慮連接錯誤現在)返回真。

的代碼如下所示:


    public class Client 
    { 
     NetClient m_NetClient = new NetClient(); 

     public void Connect(string ip, int port) 
     { 
      m_NetClient = new NetClient(); 
      m_NetClient.Connected += _NetClient_Connected; 
      m_NetClient.Connect(ip, port); 
     } 

     private void _NetClient_Connected(object sender, EventArgs e) 
     { 
      //... 
     } 
    } 

我能做些什麼,使這個邏輯同步?我需要在事件處理程序中創建一個新的線程,而不是使用類似Monitor類的東西? 有人可以給我他的opionin /代碼來實現這個目標嗎?

謝謝大家!

回答

1

A AutoResetEvent應該訣竅。

public class Client 
     { 
      NetClient m_NetClient = new NetClient(); 
      AutoResetEvent _lock = new AutoResetEvent(false); 
      bool result; 

      public bool Connect(string ip, int port) 
      { 
       m_NetClient = new NetClient(); 
       m_NetClient.Connected += _NetClient_Connected; 
       m_NetClient.Connect(ip, port); 
       _lock.WaitOne();//wait for thread to finish 
       return result; 
      } 

      private void _NetClient_Connected(object sender, EventArgs e) 
      { 
       //... 
       result = e.Result; 
       _lock.Set(); //inform waiters 
      } 
     } 
+0

感謝您的迴應;我嘗試使用Monitor.Wait e Monitor.Pulse,在Connect()上創建新線程,並且它似乎很有用。 我也會嘗試你的解決方案,謝謝! Nando –

1

確定您需要:

  1. 定義AutoResetEvent作爲私有成員
  2. 初始化它Connect
  3. m_NetClient.Connect(ip, port);電話後WaitOne()
  4. _NetClient_Connected呼叫Set()

注:

你必須要小心什麼是不是永遠鎖住你的代碼,所以你必須處理異常,並呼籲在這些情況下Set()爲好。 或者,呼叫WaitOne超時,以便鎖定在某些超時後釋放。

+0

感謝您的評論,您是對的:僵局總是落在角落:) –