C#.NET 多個子Task 多個Task.WaitAll 阻塞UI執行緒
阿新 • • 發佈:2022-05-13
情況:
DoIt()方法內,開了2個Task 執行任務,子任務中會更新UI。
DoIt() 是同步(UI執行緒)。
DoIt()部分程式碼:
var myTask = Task.Run(() => { DoIt2(lstBatch1, 1); }); Task.WaitAll(myTask); curMsg = NS() + " batch 2"; InserLbxMsg(curMsg); myTask = Task.Run(() => { DoIt2(lstBatch2, 2); }); Task.WaitAll(myTask);
DoIt2 方法內會更新UI ,InvokeInserLbxMsg(curMsg); 。
/// <summary> /// BeginInvoke /// </summary>/// <param name="curMsg"></param> void InvokeInserLbxMsg(string curMsg) { if (this.InvokeRequired) { this.BeginInvoke(new MethodInvoker(() => { lbxMsg.Items.Insert(0, curMsg); })); }else { lbxMsg.Items.Insert(0, curMsg); } }
結果導致 DoIt2 更新UI失敗,並阻塞了UI執行緒 。
解決方法:
DoIt 方法內2個Task.WaitAll,換成 ContinueWith:
var myTask = Task.Run(() => { DoIt2(lstBatch1, 1); }); myTask.ContinueWith(t => { DoIt2(lstBatch2, 2); InvokeInserLbxMsg("完成"); });
重點就是 UI執行緒的方法(同步),裡不要用Task.WaitAll。
--
C#.NET 多個子Task(多個子執行緒) 多個Task.WaitAll 阻塞UI執行緒