如果我有一个同步方法"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;
}
Run Code Online (Sandbox Code Playgroud)
(它本身称为异步方法"GetString()")
我从异步方法中调用这个同步 "GetStrings()" 方法:
public static async Task Main()
{
var ids = new List<int> { 1, 2, 3 };
await GetStrings(ids);
Console.WriteLine("all done");
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
什么是行为差异,if GetStrings()实际上是异步的?(并进行了等待Task.WhenAll)
它会直接阻止Task.WhenAll阻塞线程吗?我找到了一些看起来像这样的生产代码,所以我把这个小例子放在一起试着去了解发生了什么.但是很难确定差异.
Jon*_*eet 10
Task.WhenAll不管怎么说都不会阻挡Task.WaitAll.它只返回在所有原始任务完成时完成的任务.
重要的是要理解你没有等待一个方法 - 等待一个值(或某种必须等待的类型).await机制并不关心你是如何获得该值的.
如果GetStrings是异步的,则会有一个重要的区别:抛出的任何异常(例如,如果ids为null)将导致错误的任务,而当前异常将直接抛出.