本系列第一講第三節,介紹兩種非阻塞方式輪詢非同步操作完成狀態:IAsyncResult.IsCompleted 與 AsyncWaitHandle.WaitOne。
static void Main()
{
var del = new Func(n => { Thread.Sleep(n); return n; });
var ar = del.BeginInvoke(2000, null, null);
while (!ar.IsCompleted)
{
Console.Write("*");
Thread.Sleep(100);
}
int result = del.EndInvoke(ar);
Console.WriteLine($"\nResult: {result}");
}
輸出範例:*****Result: 2000 (星號可能在「任務開始」前輸出,因非同步並行)。
static void Main()
{
var del = new Func(n => { Thread.Sleep(n); return n; });
var ar = del.BeginInvoke(2000, null, null);
while (!ar.AsyncWaitHandle.WaitOne(100, false))
Console.Write("*");
int result = del.EndInvoke(ar);
Console.WriteLine($"\nResult: {result}");
}
WaitOne(timeout, exitContext):timeout 毫秒內等待信號,false 表示不離開同步化上下文。true 表示已收到信號 (完成),false 表示逾時。timeout=0 非阻塞檢查;timeout=-1 無限等待。| 特性 | IsCompleted 輪詢 | WaitOne 等待 |
|---|---|---|
| CPU 佔用 | 較高 (忙等待 + Sleep) | 低 (核心物件等待) |
| 回應延遲 | 取決於 Sleep 間隔 | 即時 (信號觸發) |
| 適用場景 | 簡單主控台、需定期做其他事 | 需高效等待、可整合其他 WaitHandle |
IsCompleted 適合簡單輪詢,WaitOne 效率更高且可整合 WaitHandle.WaitAll/Any。下一節將介紹回呼模式徹底避免輪詢。