C#基礎學習 —— 非同步編程篇 (二)

來源:互聯網
上載者:User

事件架構非同步模式是比 IAsyncResult 模式更進階的一種非同步編程模式,也被用在更多的場合。對於相對簡單的應用程式可以直接用 .Net 2.0 新增的 BackgroundWorker 組件來很方便的實現,對於更複雜的非同步應用程式則需要自己實現一個符合事件架構非同步模式的類。這兩者對我都是新東西,先從簡單的入手,下一篇裡我再去嘗試複雜類模型的實現

模式概述

支援事件架構非同步模式的類會有若干個 MethodNameAsync 方法表示開始非同步作業,並有對應的 MethodNameCompleted 事件。類裡面還可能會有 CancelAsync或 MethodNameAsyncCancel 方法用於取消非同步作業,並可以有 ProgressChanged 或 MethodNameProgressChanged事件來跟蹤執行進度。下面分別作一下解釋

MethodNameAsync 方法可以有兩個重載:單調用和多調用,多調用有一個額外的狀態物件參數 userState。userState 參數用來區分各次非同步作業,使得我們可以多次調用多調用形式的方法而不需要等待任何非同步作業的完成(在學習 IAsyncResult 模式時我把狀態物件僅僅當成傳給回調方法的一個條件來用,可能在使用模式時這麼做並沒有什麼關係,但在實現模式時不把狀態物件用作異常調用的唯一標識而另作他用就值得商榷了)。而單調用形式的方法如果在前一個調用尚未完成時調用將會拋出 InvalidOperationException 異常

如果有多個非同步方法呼叫,則應使用 CancelAsync 方法來取消擱置動作,並可使用 userState 來取消指定的掛起任務。如果只有一個非同步方法呼叫則可以使用 MethodNameAsyncCancel 方法

另外 MSDN 上說:一次只支援一個擱置動作的方法(如 Method1Async(string param))是不可取消的。這句話我還沒有理解,不可能說是單調用的非同步方法呼叫就不能取消吧,BackgroundWorker 上都是這樣做的

先不管了,接著看ProgressChanged 事件。它有一個 ProgressChangedEventArgs 參數,事件處理常式通過檢查該參數的 ProgressPercentage屬性來擷取任務完成的百分比。如果有多個非同步作業掛起,也可以通過檢查參數的UserState 屬性來分辨操作。如果需要用 ProgressChanged 事件來報告增量結果,則可以把結果儲存在派生自 ProgressChangedEventArgs 的類中,並在事件處理常式中使用

BackgroundWorker

BackgroundWorker 很好的符合了事件非同步作業模式。它有兩個重載版本的 RunWorkerAsync 方法(均為單調用形式)和 RunWorkerCompleted 事件,並有 CancelAsync 方法以及 ProcessChanged 事件。不同的是 BackgroundWorker增加了 DoWork 事件,在 RunWorkerAsync 方法調用時發生,以達到將實際執行的開始方法與 BackgroundWorker 分離的目的。還需要提一下的是 WorkerReportsProcess 屬性和ReportProcess 方法,前者指示能否報告進度更新,後者引發 ProcessChanged 事件,它們會在接下來的 Demo 裡用到

嘗試

因為平時經常要處理幾十兆的文字檔,這個 Demo 就做一個讀取檔案並顯示進度的控制台程式。先看類名和欄位

class BackgroundWorkerDemo
   {
     private BackgroundWorker m_bw;
     string m_FilePath;
   }

建構函式接收檔案路徑為參數,設定檔案路徑並初始化 BackgroundWorker

public BackgroundWorkerDemo(string filePath)
     {
       m_FilePath = filePath;
  m_bw = new BackgroundWorker();
       m_bw.WorkerReportsProgress = true;
       m_bw.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
       m_bw.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged);
       m_bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);
     }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.