首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Compact Framework 多執行緒同步:WaitHandle 與 AutoResetEvent 實戰指南

     編輯:關於.NET

前言:為什麼需要等待事件?

在 Windows CE 或 Windows Mobile 開發中,為了保持介面流暢,我們習慣將耗時的批次處理工作交給工作執行緒執行。當工作完成、失敗或拋出異常時,必須通知UI 執行緒進行同步更新(有時也會是在兩個 Worker Thread 之間同步,視具體架構而定)。此時,等待事件 便是核心同步機制。

.NET Compact Framework 的限制與應對

.NET Framework 的 System.Threading.WaitHandle 功能完整,但在 .NET Compact Framework 中被精簡,僅保留 WaitOne 方法(單一事件等待)。所幸,大多數 UI 同步場景只需等待單一事件,WaitOne 完全足夠。本文以其子類別 AutoResetEvent 為例示範。

核心程式碼範例

定義一個供父/子執行緒共同存取的靜態欄位:

private static AutoResetEvent autoEvent = new AutoResetEvent(false);

public bool Connect()
{
    // 執行連線前置作業...
    ThreadPool.QueueUserWorkItem(new WaitCallback(CheckConnection), null);

    // 等待工作執行緒發訊號,最多等 5 秒
    if (autoEvent.WaitOne(5000, false))
    {
        return true;
    }
    else
    {
        return false; // 逾時
    }
}

private void CheckConnection(Object stateInfo)
{
    while (true)
    {
        if (CheckConnection()) // 實際檢查邏輯
        {
            // 通知父執行緒工作完成
            autoEvent.Set();
        }
    }
}

關鍵點解析

  • AutoResetEvent(false):初始狀態為「非發訊號」,呼叫 Set() 後自動重置。
  • WaitOne(5000, false):第一個參數為逾時毫秒數,-1 表無限等待;第二個參數指定是否退出同步化內容(Compact Framework 通常傳 false)。
  • Set():在子執行緒呼叫,喚醒正在等待的父執行緒。

進階應用:服務程式的監聽迴圈

WaitHandle 也常用於服務程式的資料來源監聽:有資料則處理,無資料則等待逾時並執行例行工作,兼具 Sleep 功能。

while (true)
{
    if (autoEvent.WaitOne(5000, false))
    {
        ProcRequest(); // 處理請求
    }
    else
    {
        ProcRegularTask(); // 例行任務
    }
}

當單一事件不夠用時

若需同時等待多個事件(如 WaitForMultipleObjects),Compact Framework 不支援,必須透過 P/Invoke 呼叫 Win32 API 實現。

總結

掌握 AutoResetEvent 與 WaitOne/Set 模式,即可在 .NET Compact Framework 中輕鬆實現執行緒間的高效同步,是行動裝置開發的必備技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved