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% 就結束,歡迎高手指教改進。
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
Console.WriteLine($"Reading: {e.ProgressPercentage}%");
}
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} 字元");
}