集合初始值设定项的异步填充
Asynchronous population of collection initializer
我想使用将调用异步方法的集合初始值设定项来填充集合:
public class Diagnostics
{
public async Task<IEnumerable<DiagnosticsInfo>> Get() => new List<DiagnosticsInfo>
{
await GetDiagnosticsInfo1(),
await GetDiagnosticsInfo2(),
await GetDiagnosticsInfo3()
};
}
目的是让所有 GetDiagnosticsInfoX()
方法并行执行。
我怀疑生成的代码会同步调用 GetDiagnosticsInfoX()
方法 - 它会在调用第二个之前等待第一个调用。
我的直觉正确吗?
如果是这样,我假设我需要像这样等待所有任务:
public class Diagnostics
{
public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
var task1 = GetDiagnosticsInfo1();
var task2 = GetDiagnosticsInfo2();
var task3 = GetDiagnosticsInfo3();
await Task.WhenAll(task1, task2, task3);
return new List<DiagnosticsInfo> {task1.Result, task2.Result, task3.Result};
}
}
Is my gut feel correct?
你的直觉是对的。所有集合初始化程序所做的就是为集合调用 Add
方法。这意味着您的代码被翻译成:
public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
var list = new List<DiagnosticsInfo>();
list.Add(await GetDiagnosticsInfo1());
list.Add(await GetDiagnosticsInfo2());
list.Add(await GetDiagnosticsInfo3());
return list;
}
使用Task.WhenAll
将等待所有异步方法完成。然后您可以 return 您收到的数组:
public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
var task1 = GetDiagnosticsInfo1();
var task2 = GetDiagnosticsInfo2();
var task3 = GetDiagnosticsInfo3();
return await Task.WhenAll(task1, task2, task3);
}
我想使用将调用异步方法的集合初始值设定项来填充集合:
public class Diagnostics
{
public async Task<IEnumerable<DiagnosticsInfo>> Get() => new List<DiagnosticsInfo>
{
await GetDiagnosticsInfo1(),
await GetDiagnosticsInfo2(),
await GetDiagnosticsInfo3()
};
}
目的是让所有 GetDiagnosticsInfoX()
方法并行执行。
我怀疑生成的代码会同步调用 GetDiagnosticsInfoX()
方法 - 它会在调用第二个之前等待第一个调用。
我的直觉正确吗?
如果是这样,我假设我需要像这样等待所有任务:
public class Diagnostics
{
public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
var task1 = GetDiagnosticsInfo1();
var task2 = GetDiagnosticsInfo2();
var task3 = GetDiagnosticsInfo3();
await Task.WhenAll(task1, task2, task3);
return new List<DiagnosticsInfo> {task1.Result, task2.Result, task3.Result};
}
}
Is my gut feel correct?
你的直觉是对的。所有集合初始化程序所做的就是为集合调用 Add
方法。这意味着您的代码被翻译成:
public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
var list = new List<DiagnosticsInfo>();
list.Add(await GetDiagnosticsInfo1());
list.Add(await GetDiagnosticsInfo2());
list.Add(await GetDiagnosticsInfo3());
return list;
}
使用Task.WhenAll
将等待所有异步方法完成。然后您可以 return 您收到的数组:
public async Task<IEnumerable<DiagnosticsInfo>> Get()
{
var task1 = GetDiagnosticsInfo1();
var task2 = GetDiagnosticsInfo2();
var task3 = GetDiagnosticsInfo3();
return await Task.WhenAll(task1, task2, task3);
}