[C#.NET][TPL] 善用 Parallel Tasks 和 Parallel Stacks 視窗除錯

[C#.NET][TPL] 善用 Parallel Tasks 和 Parallel Stacks 視窗除錯

當程式按下中斷時,我們可以調用 Parallel Tasks 和 Parallel Stacks 來觀察 TPL 的狀況,TPL 也是 Thread,所以我也將 Threads 加入觀察,其實這三個視窗有連動關係,點了某一視窗的Row,其他視窗的顯示也會跟著移動。

下圖為視窗調用方式:

image

 

 

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();
}

 

設定中斷點,如下圖:

 

image

 

我們就可以藉由中斷,按F11一步步的觀察執行緒狀況,如下圖:

image

 

接著按F11,逐步追蹤,觀察 TPL 的執行狀況,如下圖:

image

 

Parallel Stacks 的Threads 可以看出執行緒的分配情況,如下圖紅框處:

image

 


接著,用以下程式碼,來觀察 Parallel.For 迴圈

 

private void DoWork7()
{
    Parallel.For(1, 10000, i =>
    {
        var result = i.ToString();
        Console.WriteLine(result);
        Thread.Sleep(100);
    });
}



 

由下圖得知,我們可以看到迴圈內裡的程式碼其實是一個匿名方法,它會將這些方法平均分派給CPU,還是要再提醒一下,一定要確定迴圈內的方法是獨立的流程,才能發揮平行運算的效果

image

 

由下圖得知,Parallel.For 將匿名方法切成了 9 個 Task

image

 

更多更詳細的資料請參考以下:

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

Image result for microsoft+mvp+logo