[C#.NET][TPL] 善用 Parallel Tasks 和 Parallel Stacks 視窗除錯
當程式按下中斷時,我們可以調用 Parallel Tasks 和 Parallel Stacks 來觀察 TPL 的狀況,TPL 也是 Thread,所以我也將 Threads 加入觀察,其實這三個視窗有連動關係,點了某一視窗的Row,其他視窗的顯示也會跟著移動。
下圖為視窗調用方式:
private void DoWork6() { CancellationTokenSource cts = new CancellationTokenSource(); Task mainTask = new Task(() => { Task t1 = new Task(() => SpinWait.SpinUntil(() => { cts.Token.ThrowIfCancellationRequested(); Thread.CurrentThread.Name = "t1"; return false; }, 100000), cts.Token); Task t2 = new Task(() => SpinWait.SpinUntil(() => { cts.Token.ThrowIfCancellationRequested(); Thread.CurrentThread.Name = "t2"; return false; }, 100000), cts.Token); Task t3 = new Task(() => { Thread.CurrentThread.Name = "t3"; ulong result = 0; for (int i = 0; i < 1000000; i++) { result++; var str = result.ToString(); Thread.Sleep(10); } }, cts.Token); t1.Start(); t2.Start(); t3.Start(); Task.WaitAll(t1, t2, t3); MessageBox.Show("DONE"); }); mainTask.Start(); }
設定中斷點,如下圖:
我們就可以藉由中斷,按F11一步步的觀察執行緒狀況,如下圖:
接著按F11,逐步追蹤,觀察 TPL 的執行狀況,如下圖:
Parallel Stacks 的Threads 可以看出執行緒的分配情況,如下圖紅框處:
接著,用以下程式碼,來觀察 Parallel.For 迴圈
private void DoWork7() { Parallel.For(1, 10000, i => { var result = i.ToString(); Console.WriteLine(result); Thread.Sleep(100); }); }
由下圖得知,我們可以看到迴圈內裡的程式碼其實是一個匿名方法,它會將這些方法平均分派給CPU,還是要再提醒一下,一定要確定迴圈內的方法是獨立的流程,才能發揮平行運算的效果
由下圖得知,Parallel.For 將匿名方法切成了 9 個 Task
更多更詳細的資料請參考以下:
http://msdn.microsoft.com/zh-tw/library/dd998369.aspx
http://msdn.microsoft.com/zh-tw/library/dd998398.aspx
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET