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

並發事件:使用 AsyncEnumerator 簡化 APM (4) — 架構欄位與 ResumeIterator 核心邏輯

     編輯:關於C語言

AsyncEnumerator 架構欄位

圖 3:AsyncEnumerator 欄位


public partial class AsyncEnumerator {
    private IEnumerator<Int32> m_enumerator;           // 迭代器程式碼參考
    private List<IAsyncResult> m_inbox = new List<IAsyncResult>(); // 已完成作業收件箱
    private WaitAndInboxCounts m_waitAndInboxCounts;   // 等待/收件箱計數器結構
}

Execute → ResumeIterator 驅動迭代器

Execute 內部呼叫 ResumeIterator 啟動或恢復迭代器:


private void ResumeIterator() {
    Boolean continueIterating;
    while (continueIterating = m_enumerator.MoveNext()) {
        UInt16 numberOpsToWaitFor = checked((UInt16)m_enumerator.Current);
        if (!m_waitAndInboxCounts.AtomicSetWait(numberOpsToWaitFor)) break;
    }
    if (continueIterating) return; // 收件箱不足,暫停
    m_enumerator.Dispose();      // 迭代器結束,執行 finally 區塊
}

運作流程

  1. MoveNext() 喚醒迭代器,若回傳 false(結束或 yield break) → 執行 Dispose() 清理並返回。
  2. 若回傳 true → 迭代器已發起非同步作業並 yield return N 暫停。
  3. 讀取 Current 取得需等待作業數 N。
  4. AtomicSetWait(N) 設定等待計數:
     • 收件箱項目數 < N → 回傳 false,ResumeIterator 返回,執行緒閒置。
     • 收件箱項目數 ≥ N → 回傳 true,迴圈繼續,再次 MoveNext() 恢復迭代器處理結果。

非同步作業完成時,AsyncCallback 將 IAsyncResult 放入收件箱,若滿足等待計數即觸發恢復。

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