簡體   English   中英

在同一線程中執行await任務之前和之后的代碼部分

[英]the part of code before and after await task is executed in same thread

我的控制台應用程序項目中包含以下代碼:

static void Main()
{
    Console.WriteLine($@"{Thread.CurrentThread.ManagedThreadId}, main");
    var list = new List<Task<int>>();
    for (int i = 1; i < 4; i++)
    {
        list.Add(GetValueAsync(i, i, i));
        //list.Add(GetValueAsync());
    }

    var whenAll = Task.WhenAll(list);
    whenAll.Wait();

    Console.WriteLine(@"End program");
    Console.ReadLine();
}


private static async Task<int> GetValueAsync(int val, int delay, int taskId)
{
    Console.WriteLine($@"{Thread.CurrentThread.ManagedThreadId}, task{taskId} sleep");

    await Task.Delay(1000 * delay);

    Console.WriteLine($@"{Thread.CurrentThread.ManagedThreadId}, task{taskId} awake");
    return val;
}

private static int index = 0;
private static async Task<int> GetValueAsync()
{
    index++;
    Console.WriteLine($@"{Thread.CurrentThread.ManagedThreadId}, task{index} sleep");

    await Task.Delay(2000);

    Console.WriteLine($@"{Thread.CurrentThread.ManagedThreadId}, task{index} awake");
    return 10;
}

當我使用帶有參數的 GetValueAsync時我得到了這一點:

在此處輸入圖片說明

當我使用不帶參數的 GetValueAsync時我得到了這個:

在此處輸入圖片說明

當我使用GetValueAsync(int val, int delay, int taskId)為什么在同一線程中執行await Task.Delay(1000 * delay)之后的代碼部分? 如果我沒有記錯,那么等待的部分應該在新線程中執行...(當前項目是控制台應用程序,主線程不是GUI線程)

這些問題總是很難回答的,因為對於剛接觸該主題的人來說,答案似乎從未令人滿意

如果將代碼更改為以下內容。 您將獲得預期的結果

list.Add(GetValueAsync(i, 1, i));

輸出量

1, main
1, task1 sleep
1, task2 sleep
1, task3 sleep
5, task2 awake
4, task3 awake
6, task1 awake
End program

那么最初的結果怎么了? 簡單地說,需要更多線程,回調發生足夠的延遲才能重用同一線程。 任務計划程序認為無需為您分配更多(或不同)資源

你的兩個功能有不同的延遲

第一個具有可變延遲(1、2和3秒),第二個具有恆定延遲(2秒)

如果你寫

await Task.Delay(2000); //instead of await Task.Delay(1000 * delay);

您將獲得與第二個功能相同的結果

threadid並不是真正的增量值,當線程完成時,其“ id”可用

在您的情況下,相同的threadID是不同的任務

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM