![](/img/trans.png)
[英]What happens to the resources when you block on a asynchronous wrapper for a synchronous method?
[英]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.