如果我有一个同步的方法 "GetStrings()":
“我自己调用了异步方法“GetString()”,它本身也会调用这个方法。同时,我从一个异步方法中调用了这个同步方法“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
阻塞线程?我找到了一些类似于这样的生产代码,因此我编写了这个小例子来尝试理解发生了什么。但很难确定其中的差异。