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