程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET Compact Framework多線程下的等待事件

.NET Compact Framework多線程下的等待事件

編輯:關於.NET

在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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved