在WinCE或者Windows Moblie開發中常常把大量的批處理工作提交給工作進程 (Worker Thread)進行,當批處理工作完成時,或者該進程發生失敗以及異常的 時候需要通知界面進程(UI Thread)進行同步。(PS:有時候同步的是兩個 worker thread,而不是UI Thread,這由具體應用來決定。)這時候往往需要等 待事件。。NET Framework 提供的等待事件封裝在System.Threading.WaitHandle 裡面。但是。NET Compact Framework下的WaitHandle不能提供。NET Framework 所有的功能,在等待時間裡只是提供了WaitOne功能(只能等待一個Event)。其 實在一般的應用,UI進程往往等待一個事件就夠了,下面演示WaitOne的使用。
由於WaitHandle是一個抽象類(abstract class),所以例子使用其sub- class AutoResetEvent .
定義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();
}
}
如果等待單個事件不夠只能使用Win32的API WaitForMultipleObjects了。那 就需要P/Invoke。