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

C# 非同步程式設計基礎(二·下):BackgroundWorker 事件處理實作與檔案讀取進度回報

     編輯:關於C語言

DoWork 事件:背景執行緒執行耗時操作

private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
    long fileLength;
    using (var sr = new StreamReader(_filePath)) {
        fileLength = sr.ReadToEnd().Length; // 先讀完取得長度 (效能較差但準確)
    }
    long onePercent = fileLength / 100;
    long current = 0;
    using (var sr = new StreamReader(_filePath)) {
        while (!sr.EndOfStream) {
            sr.Read(); current++;
            while (current > onePercent * (i+1)) { // i 為已回報百分比
                ((BackgroundWorker)sender).ReportProgress(++i);
            }
        }
        e.Result = current; // 傳遞給 RunWorkerCompleted
    }
}

註:作者承認先讀完再處理效能不佳,因 StreamReader.BaseStream.Length 或 FileInfo.Length 導致許多檔案讀不到 100% 就結束,歡迎高手指教改進。

ProgressChanged 事件:UI 執行緒接收進度

private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    Console.WriteLine($"Reading: {e.ProgressPercentage}%");
}

RunWorkerCompleted 事件:完成/取消/錯誤統一處理

private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    if (e.Cancelled) Console.WriteLine("已取消");
    else if (e.Error != null) Console.WriteLine($"錯誤: {e.Error.Message}");
    else Console.WriteLine($"完成,共讀取 {e.Result} 字元");
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved