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

並發事件:使用 AsyncEnumerator 簡化 APM (1) — AsyncEnumerator 類別介面與迭代器撰寫指南

     編輯:關於C語言

AsyncEnumerator 類別定義


public class AsyncEnumerator {
    public AsyncEnumerator();
    public void Execute(IEnumerator<Int32> enumerator); // 外部呼叫
    public AsyncCallback End();                         // 迭代器內呼叫
    public IAsyncResult DequeueAsyncResult();           // 迭代器內呼叫
}

迭代器撰寫規範

  1. 回傳型別 IEnumerator<Int32>,參數含 AsyncEnumerator ae 參考。
  2. 每個非同步作業:呼叫 BeginXxx(..., ae.End(), null) 啟動。
  3. 緊接著 yield return N(N 為發起作業數),暫停迭代器。
  4. 作業完成時,AsyncEnumerator 內部回調將 IAsyncResult 放入收件箱。
  5. 收件箱項目數達 N 時,自動恢復迭代器,呼叫 ae.DequeueAsyncResult() 取出結果供 EndXxx 使用。
  6. 在迭代器內以同步風格處理結果,可繼續發起下一輪作業。

範例迭代器:非同步讀取檔案


private static IEnumerator<Int32> ApmPatternWithIterator(AsyncEnumerator ae, String pathname) {
    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, ae.End(), null);
        yield return 1;
        Int32 bytesRead = fs.EndRead(ae.DequeueAsyncResult());
        ProcessData(data);
    }
}

foreach 無法直接驅動此迭代器(會連續執行不暫停),必須透過 AsyncEnumerator.Execute 智慧排程,讓不同執行緒池執行緒在不同時刻執行各段代碼,確保僅在非同步 I/O 完成後繼續。

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