我有以下示例代码:
private async Task<IEnumerable<long>> GetValidIds1(long[] ids)
{
var validIds = new List<long>();
var results = await Task.WhenAll(ids.Select(i => CheckValidIdAsync(i)))
.ConfigureAwait(false);
for (int i = 0; i < ids.Length; i++)
{
if (results[i])
{
validIds.Add(ids[i]);
}
}
return validIds;
}
private async Task<IEnumerable<long>> GetValidIds2(long[] ids)
{
var validIds = new ConcurrentBag<long>();
await Task.WhenAll(ids.Select(async i =>
{
var valid = await CheckValidIdAsync(i);
if (valid)
validIds.Add(i);
})).ConfigureAwait(false);
return validIds;
}
private async Task<bool> CheckValidIdAsync(long id);
我目前使用的是GetValidIds1(),但它的不便之处在于必须将输入ID与最后使用index的结果绑定在一起.
GetValidIds2()是我想要编写的内容,但有几个问题:
- 我在SELECT lambda表达式中有‘Await’.因为LINQ是延迟计算,我认为它不会阻止其他
CheckValidIdAsync()
个调用的启动,但它究竟挂起了谁的上下文?每个MSDN文档
等待运算符挂起封闭的异步方法的计算,直到其操作数表示的异步操作完成.
那么,在本例中,封闭的异步方法本身就是lambda表达式,所以它不会影响其他调用?
- 有没有更好的方法来处理异步方法的结果并将该过程的输出收集到列表中?