是否有一个非阻塞的Task.WaitAll
,类似于Task.WhenAll
,但不是并行的?
我写了这个,但也许它已经内置了吗?
public async Task<IEnumerable<T>> AwaitAllAsync<T>(IEnumerable<Task<T>> tasks)
{
List<T> result = new List<T>();
foreach(var task in tasks)
{
result.Add(await task);
}
return result;
}
我想知道在异步操作中是否有一种内置的等待所有任务完成的方法,但是按顺序执行。
考虑以下代码:
public class SaveFooCommandHandler : ICommandHandler<SaveFooCommand>
{
private readonly IBusinessContext context;
public SaveFooCommandHandler(IBusinessContext context)
{
this.context = context;
}
public async Task Handle(SaveFooCommand command)
{
var foos = (await Task.WhenAll(command.Foos.Select(foo => context.FindAsync<Foo>(foo.Id))).ToList()
...
}
}
那将会失败,但是
var foos = await context.AwaitAllAsync(command.Foos.Select(foo => context.FindAsync<Foo>(foo.Id));
不会,context.FindAsync
是 dbcontext.Set<T>().FindAsync
的一个抽象。
你可以使用await context.Set<Foo>().Where(f => command.Foos.Contains(f.Id)).ToListAsync()
,但这个例子是简化过的。
Task.WhenAll
。 - Yuval Itzchakov