.NET 2.0 引入,比 APM (IAsyncResult) 更高階、更符合元件設計慣例:
MethodNameAsync:啟動非同步操作 (可多載:單一呼叫/多重呼叫含 userState)MethodNameCompleted:完成事件 (AsyncCompletedEventArgs)CancelAsync / MethodNameAsyncCancel:取消掛起操作ProgressChanged / MethodNameProgressChanged:進度回報 (ProgressChangedEventArgs 含 ProgressPercentage/UserState)單一呼叫 vs 多重呼叫:單一呼叫進行中再次呼叫拋出 InvalidOperationException;多重呼叫透過 userState 區分各操作,支援並發。
完整實作 EAP 模式的現成元件:
RunWorkerAsync() (單一呼叫) → 引發 DoWork (背景執行緒) → 定期 ReportProgress() → 引發 ProgressChanged (UI 執行緒) → 完成引發 RunWorkerCompletedWorkerReportsProgress:啟用進度回報CancelAsync():請求取消 (需在 DoWork 內檢查 CancellationPending)class BackgroundWorkerDemo {
private BackgroundWorker _bw;
private string _filePath;
public BackgroundWorkerDemo(string filePath) {
_filePath = filePath;
_bw = new BackgroundWorker { WorkerReportsProgress = true };
_bw.DoWork += BackgroundWorker_DoWork;
_bw.ProgressChanged += BackgroundWorker_ProgressChanged;
_bw.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
}
public void Start() => _bw.RunWorkerAsync();
}
場景:讀取大型文字檔 (數十 MB) 並顯示進度百分比。