簡體   English   中英

等待同步方法時會發生什么

[英]What happens when you await a synchronous method

如果我有一個同步方法“GetStrings()”:

private static Task<string[]> GetStrings(IEnumerable<int> ids)
{
    var tasks = ids.Distinct().Select(GetString);
    return Task.WhenAll(tasks);
}

private static async Task<string> GetString(int stringId)
{
    await Task.Delay(15000);
    return "hello" + stringId;
}

(它本身稱為異步方法“GetString()”)

我從異步方法中調用這個同步 “GetStrings()”方法:

public static async Task Main()
{
    var ids = new List<int> { 1, 2, 3 };
    await GetStrings(ids);
    Console.WriteLine("all done");
    Console.ReadLine();
}

如果GetStrings( )實際上是異步的,那么行為差異會是什么? (並在Task.WhenAll上進行了等待)

它會簡單地阻止Task.WhenAll阻止線程嗎? 我找到了一些看起來像這樣的生產代碼,所以我把這個小例子放在一起試着去了解發生了什么。 但是很難確定差異。

Task.WhenAll不會阻塞,與Task.WaitAll不同。 它只返回在所有原始任務完成時完成的任務。

重要的是要理解你沒有等待一個方法 - 等待一個 (或某種必須等待的類型)。 await機制並不關心你是如何獲得該值的。

如果GetStrings是異步的,則會有一個重要的區別:拋出的任何異常(例如,如果ids為null)將導致出現故障,而當前異常將直接拋出。

暫無
暫無

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

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