gpt4 book ai didi

c# - Task.WhenAll 的顺序版本

转载 作者:行者123 更新时间:2023-11-30 19:09:13 28 4
gpt4 key购买 nike

有没有非阻塞的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.FindAsyncdbcontext.Set<T>().FindAsync 的抽象

你可以做 await context.Set<Foo>().Where(f => command.Foos.Contains(f.Id)).ToListAsync() , 但这个例子被简化了。

最佳答案

我认为核心的误解是关于 Task 类型的。在异步代码中,Task 总是已经在运行。所以这没有意义:

Is there a non-blocking Task.WaitAll similar to Task.WhenAll but not parallel concurrent?

如果您有一组任务,它们都已经开始

I want to know if there is a build in way of waiting for all tasks to complete in async but sequential way.

当然,您可以按顺序 await 它们。标准模式是在 foreach 循环中使用 await,就像您发布的方法一样。

但是,sequential-await 起作用的唯一原因是您的 LINQ 查询是延迟计算的。特别是,如果你 reify你的任务集合,它会失败。所以这有效:

var tasks = command.Foos.Select(foo => context.FindAsync<Foo>(foo.Id));
var foos = await context.AwaitAllAsync(tasks);

这失败了:

var tasks = command.Foos.Select(foo => context.FindAsync<Foo>(foo.Id))
.ToList();
var foos = await context.AwaitAllAsync(tasks);

在内部,Task.WhenAll 具体化了您的任务序列,因此它知道需要等待多少任务。

但这真的离题了。您要解决的真正问题是如何串行执行异步代码,使用 foreach 最容易完成:

var foos = new List<Foo>();
foreach (var fooId in command.Foos.Select(f => f.Id))
foos.Add(await context.FindAsync<Foo>(fooId));

关于c# - Task.WhenAll 的顺序版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30306497/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com