在WinCE或者Windows Moblie開發中常常把大量的批處理工作送出給工作程序(Worker Thread)進行,當批處理工作完成時,或者該程序發生失敗以及異常的時候需要通知界面程序(UI Thread)進行同步。(PS:有時候同步的是兩個worker thread,而不是UI Thread,這由具體應用來決定。)這時候往往需要等待事件。

//定義field,父線程和子線程都需要通路到。
private static AutoResetEvent autoEvent = new AutoResetEvent(false);
public bool Connect()
{
//Do sth. eg make connections.
ThreadPool.QueueUserWorkItem(
new WaitCallback(CheckConnection), null);
// Wait for work method to signal.
if (autoEvent.WaitOne(5000, false))
{
return true;
}
else
return false;
}
private void CheckConnection(Object stateInfo)
while(true)
{
if (CheckConnection())
// Signal that work is finished.
autoEvent.Set();
}

定義一個AutoResetEvent 的對象,在父程序和子程序都會使用到。WaitOne()用在父程序裡,第一個參數為等待時間,如果為-1表示一直等待不傳回。
Set()用在子線程,當批處理完成後可以調用Set()來通知父程序。
WaitHandle應用廣泛,例如可以應用在服務程式偵聽資料來源,當有資料時進行處理,沒有的時候等待timeout時間,處理regular的事情。這樣還起到sleep的作用。

while(true)
if (autoEvent.WaitOne(5000, false))
ProcReques();
else
ProcRegularTask();

參考文獻
<a target="_blank" href="http://msdn.microsoft.com/en-us/library/kzy257t0.aspx">.NET Framework WaitHandle Members</a>
本文轉自Jake Lin部落格園部落格,原文連結:http://www.cnblogs.com/procoder/archive/2009/01/19/1378013.html,如需轉載請自行聯系原作者