您可以使用助手來等待事件。一些醜陋的代碼從過去:
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);
過寬,則可以顯示你現在在做什麼以及你想要什麼?內部方法,您可以訂閱事件,阻止執行,直到超時或事件處理程序被調用,然後繼續,如果這是問題。 – Sinatr
我想我能夠阻止當前的事件處理程序做任何事情 - 即。刪除它,然後在方法內部捕獲響應以獲取該命令響應,然後再次啓用它,但它感覺不正確 –
然後不要使用事件處理程序。提供另一種信令機制(例如'Monitor.Pulse' /'Monitor.Wait')。在過去,我爲訂閱事件的通信類寫了幫手,等待具體回覆然後返回。但後來我發現'Monitor'的存在(感謝[Albahari](http://www.albahari.com/threading/part4.aspx#_Signaling_with_Wait_and_Pulse))並從那時起使用它。 – Sinatr