簡體   English   中英

這兩種異步方法有什么區別?

[英]What is the difference between these two asynchronous methods?

這兩種異步方法有什么區別? 如果沒有,這兩種方法在哪種情況下會有所不同?

謝謝。

public async Task<int> MyMethod1Async()
{
    return 1;
}

public async Task<int> MyMethod2Async()
{
    return await new Task<int>(() => 1);
}

第一個方法返回一個已經完成的任務, Result1

第二種方法返回一個永遠不會完成的Task<int>

看一下這兩種方法:

public async Task<int> MyMethod1Async()
{
    return 1;
}

這將同步運行,因為其中沒有“await”運算符 - 它只返回 1,因此與您剛剛完成以下操作沒有什么不同:

public int MyMethod1()
{
    return 1;
}

以下方法可能更好地說明了異步的不同“類型”之間的區別:

    public async Task<string> MyMethod1Async()
    {
        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri("SomeBaseAddress");

            // This will return control to the method's caller until this gets a result from the server
            HttpResponseMessage message = await client.GetAsync("SomeURI");

            // The same as above - returns control to the method's caller until this is done
            string content = await message.Content.ReadAsStringAsync();

            return content;
        }
    }

像這樣的代碼不一定會產生額外的線程(除非微軟碰巧實現了那些特定的庫調用)。 無論哪種方式,await/async都不需要創建額外的線程; 它可以在同一線程上異步運行。

我對此事實的標准說明如下:假設您去一家有 10 人的餐廳。 服務員過來的時候,第一個點菜的人還沒准備好; 然而,其他9人是。 因此,服務員向其他 9 個人詢問他們的訂單,然后回到原來的人那里,希望他屆時准備好點菜。 (絕對不是這樣的,他們會找第二個服務員來等待原來的人准備好點菜,而且這樣做可能不會節省太多時間)。 這就是 async/await 在許多情況下的工作方式(例外是一些 Task Parallel 庫調用,如 Thread.Run(...),實際上在其他線程執行的——在我們的插圖中,引入了第二個服務員——所以確保您檢查文檔是哪個)。

您列出的下一項將不起作用,因為您只是創建了任務,實際上並未對其進行任何操作:

public async Task<int> MyMethod2Async()
{
    return await new Task<int>(() => 1);
}

我假設您實際上打算執行以下操作:

public async Task<int> MyMethod2Async()
{
    return await Task.Run<int>(() => 1);
}

這將在線程池中運行 lambda 表達式,將控制權返回給 MyMethod2Async 的調用者,直到 lambda 表達式有結果,然后在有結果后從 lambda 表達式返回值。

總而言之,區別在於您是在同一個線程上異步運行(相當於您餐桌上的第一個人告訴服務員在其他人都點完菜后回來找他)還是您在單獨的線程上運行任務線。

冒着將事情過度簡化的風險,CPU 密集型任務通常應該在后台線程上異步運行。 然而,IO-bound 任務(或其他情況下,holdup 主要只是等待來自外部系統的某種結果)通常可以在同一個線程上異步運行; 將它放在后台線程上與在同一線程上異步執行它不一定會有很大的性能改進。

暫無
暫無

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

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