IProgress.Report 返回 void,無法 await,需在進度報告完成後執行後續邏輯。
Progress.Report 只是同步調用傳遞給 Progress 構造函數的 Action,本身不涉及異步。若報告動作耗時,應將耗時邏輯放入 Task.Run,而非指望 Report 異步化。
// 1. 定義耗時操作返回結果
Func updateAction = () => UpdateResult(dictionaryStockReal[stockCode]);
// 2. 線程池異步執行
var task = Task.Run(updateAction);
// 3. 可選:同步進度報告(UI 線程)
progress.Report("開始更新...");
// 4. 等待完成並獲取結果
int result = await task; // 異步等待,不阻塞 UI
// 5. 後續邏輯
if (result == 1) { ... }
IProgress 設計目的是跨線程安全回調 UI,而非任務協調。SynchronizationContext.Post,無異步等待語義。Task/ValueTask/TaskCompletionSource。public async Task DoWorkWithProgress(IProgress progress) {
progress.Report("階段1: 解析數據");
var data = await Task.Run(() => ParseData());
progress.Report("階段2: 計算結果");
int result = await Task.Run(() => Compute(data));
progress.Report("完成");
return result;
}
// 調用
var progress = new Progress(msg => txtLog.AppendText(msg + "\n"));
int result = await DoWorkWithProgress(progress);
拋棄 IProgress.Report 的等待幻想,用 Task.Run 承載耗時邏輯,await 等待完成,Progress.Report 僅用於同步推送進度文本到 UI。