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

C# 執行緒系列講座(一):BeginInvoke/EndInvoke 非同步模式 (三) 判斷完成狀態

     編輯:關於C語言

前言

本系列第一講第三節,介紹兩種非阻塞方式輪詢非同步操作完成狀態:IAsyncResult.IsCompleted 與 AsyncWaitHandle.WaitOne。

方法一:輪詢 IsCompleted


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 (星號可能在「任務開始」前輸出,因非同步並行)。

方法二:WaitOne 等待


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。下一節將介紹回呼模式徹底避免輪詢。

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