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

並發事件:使用 AsyncEnumerator 簡化 APM (2) — 深度解析 AsyncEnumeration 環境與 CCR 對比

     編輯:關於C語言

AsyncEnumeration 環境深度分析

C# 迭代器處理非同步是並發程式挑戰之一。Microsoft 並行與協調執行階段 (CCR) 提供更通用框架,同樣支援迭代器非同步枚舉:


IEnumerator<ITask> CcrIterator(string pathname) {
    var resultPort = new Port<IAsyncResult>();
    using (FileStream fs = new FileStream(pathname, FileMode.Open, FileAccess.Read, FileShare.Read, 8192, FileOptions.Asynchronous)) {
        Byte[] data = new Byte[fs.Length];
        fs.BeginRead(data, 0, data.Length, resultPort.Post, null);
        yield return resultPort;
        IAsyncResult ar = resultPort;
        Int32 bytesRead = fs.EndRead(ar);
    }
    ProcessData(data);
}

CCR 另提供異常處理與仲裁器等協調原語擴充支援。—— Howard Dierking 主編

核心模式:BeginXxx → yield return → EndXxx → 處理結果 → 繼續下一輪

  1. 發起非同步作業 BeginXxx(..., ae.End(), null)。
  2. yield return 1 暫停,告知需等待 1 項作業。
  3. 作業完成,ae.DequeueAsyncResult() 取出 IAsyncResult 傳給 EndXxx。
  4. **在迭代器內部同步風格處理結果** — 這是關鍵優勢:寫非同步代碼卻擁有同步程式模型。
  5. 若需串接多個作業,重複上述步驟,輕鬆構建非同步管線且不阻塞任何執行緒。

HtmlToFile 迭代器範例

從 Web 伺服器以 1KB 為單位讀取 HTML 並存檔(見上一節完整程式碼)。呼叫方式:


AsyncEnumerator ae = new AsyncEnumerator();
ae.Execute(HtmlToFile(ae, "https://www.Wintellect.com/", "LocalFile.Html"));

迭代器接受參數並持有 AsyncEnumerator 參考以呼叫 End/DequeueAsyncResult。

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