程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 並發事件:使用AsyncEnumerator簡化APM(2)

並發事件:使用AsyncEnumerator簡化APM(2)

編輯:關於C語言

深入分析:AsyncEnumeration 環境

使用 C# 迭代器執行異步處理是與並發編程相關的大量挑戰之一。目前,Microsoft 已制定了多項開 發計劃來應對這些挑戰。

其中一項計劃是並發與協調運行庫 (CCR),它是一種更為通用的框架,可用於解決與異步和並發相關 的各種問題。

CCR 包括對使用 C# 迭代器執行異步枚舉的實現。例如,以下代碼展示了在 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 主編

在 yIEld return 語句後,應調用相應的 EndXxx 方法。調用 EndXxx 方法時,需要為其傳遞一個 IAsyncResult 對象。幸運的是,AsyncEnumerator 對象已在其收件箱中將這些對象排隊,因此,您只需 通過調用 AsyncEnumerator 對象的 DequeueAsyncResult 方法取出這些對象即可。這些項目將使用先進 先出 (FIFO) 算法從收件箱中取出。

EndXxx 方法返回值後,即可直接在迭代器內部處理異步操作的結果!這太棒了,因為盡管您正在執行 異步操作,但卻擁有了一個同步編程模型。

在許多情況下,都最好是現在通過調用其他 BeginXxx 方法對另一個異步操作進行排隊。在迭代器中 ,您可以調用另一個 BeginXxx 方法,然後在調用相應的 EndXxx 方法後添加一個 yIEld return 1 語句 。這樣,您就可以輕松地逐個執行一系列異步操作,而不阻止任何線程。此外,您還可以使用同步編程模 型編寫所有代碼!

例如,圖 2 中顯示的 HtmlToFile 迭代器可從 Web 服務器中讀取以 1 千字節 (KB) 為單位的 HTML 塊,並將其保存到本地文件中。調用迭代器非常簡單:先構建一個 AsyncEnumerator 對象,然後調用其 Execute 方法,向其傳遞迭代器成員的名稱即可。您可以向迭代器成員傳遞參數,還會向迭代器傳遞對 AsyncEnumerator 對象的引用,使迭代器可以調用 End 和 DequeueAsyncResult 方法。調用 HtmlToFile 迭代器的代碼如下所示:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved