圖 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 啟動或恢復迭代器:
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 區塊
}
MoveNext() 喚醒迭代器,若回傳 false(結束或 yield break) → 執行 Dispose() 清理並返回。true → 迭代器已發起非同步作業並 yield return N 暫停。Current 取得需等待作業數 N。AtomicSetWait(N) 設定等待計數:false,ResumeIterator 返回,執行緒閒置。true,迴圈繼續,再次 MoveNext() 恢復迭代器處理結果。非同步作業完成時,AsyncCallback 將 IAsyncResult 放入收件箱,若滿足等待計數即觸發恢復。