1. 程式人生 > 其它 >C#.NET 多個子Task 多個Task.WaitAll 阻塞UI執行緒

C#.NET 多個子Task 多個Task.WaitAll 阻塞UI執行緒

情況:

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執行緒