2016-04-12 45 views
0

我很新的C#和當然OOP的概念..所以原諒我的問題的愚蠢。使用事件處理程序 - 但並不總是..(我怎麼...)

我有一個我希望與之通信的系統,它有許多可以用相關響應調用的命令。 (通過TCP/IP或串行通信)(我實現了與SendMessage的接口,以便我可以使用多個傳輸機制)

我想爲每個命令創建一個方法,然後公開這些,這很簡單。該設備還可以說'廣播'消息以及我想要採取行動,所以我正在使用這個事件處理程序,這很好運行。

當前在事件處理程序中,我捕獲OK和ERROR樣式消息,但理想情況下,我也希望能夠從上述方法發送命令並捕獲錯誤並根據命令返回一個布爾值。

任何人都可以想到一種方式,我可以做這樣的事情,並指出我在正確的方向嗎?

感謝

大衛

+0

過寬,則可以顯示你現在在做什麼以及你想要什麼?內部方法,您可以訂閱事件,阻止執行,直到超時或事件處理程序被調用,然後繼續,如果這是問題。 – Sinatr

+0

我想我能夠阻止當前的事件處理程序做任何事情 - 即。刪除它,然後在方法內部捕獲響應以獲取該命令響應,然後再次啓用它,但它感覺不正確 –

+0

然後不要使用事件處理程序。提供另一種信令機制(例如'Monitor.Pulse' /'Monitor.Wait')。在過去,我爲訂閱事件的通信類寫了幫手,等待具體回覆然後返回。但後來我發現'Monitor'的存在(感謝[Albahari](http://www.albahari.com/threading/part4.aspx#_Signaling_with_Wait_and_Pulse))並從那時起使用它。 – Sinatr

回答

0

您可以使用助手來等待事件。一些醜陋的代碼從過去:

public class ComWait 
{  
    ManualResetEvent _waitEvent; 
    SomeEvent _eventHandler; 

    public ComWait() 
    { 
     _waitEvent = new ManualResetEvent(false); 
     _eventHandler = new SomeEvent(Watch); 
    } 

    void Watch() 
    { 
     _waitEvent.Set(); 
    } 

    public bool Wait(int time = 3000) 
    { 
     _waitEvent.Reset(); 
     SomeEvent += _eventHandler; 
     bool result = _waitEvent.WaitOne(time, false); 
     SomeEvent -= _eventHandler; 
     return result; 
    } 
} 

用法是

ComWait wait = new ComWait(); 
if(!wait.Wait()) 
    return; // timeout 
// process 

它將簡單地阻止同步方法,直到事件被惜售或發生超時。應該很容易添加參數:在特定事件上解除阻塞並將事件處理參數傳回給調用者。


否則我也只會方法通信類中的阻斷劑的使用方法:

readonly object _waitLock = new object(); 

public void Wait() 
{ 
    lock (_waitLock) 
     if (!Monitor.Wait(_waitLock, 3000)) 
      throw new TimeoutException("No communications"); 
} 

信號在同一時間,因爲你上升事件:

lock (_waitLock) 
    Monitor.PulseAll(_waitLock); 
相關問題