【发布时间】:2025-12-22 16:55:12
【问题描述】:
假设我有一个需要异步处理的对象集合。
List<Customer> customers = GetAllCustomers();
customers.ForEach(async (e) => { await e.Process(); });
我假设这些将在不保留当前线程的情况下异步处理。我想知道的是集合中的客户数量是否有限制。如果是 100, 000 怎么办。它会在异步队列中排队吗?
** 我也不确定这是否是正确的方法。我真的不需要等待每个客户处理的结果。我只想无缝地处理所有的客户数据。我不在乎每个过程是否失败,因为它将再次被拾取直到成功。我可以使用任务,但我宁愿不创建导致可能的赛车条件等的线程。**
【问题讨论】:
-
你知道任务是做什么的吗?
-
您将
async voidlambdaAction传递给Parallel.ForEach。您应该知道,执行控制将立即返回到Parallel.ForEach,只要它在 lambda 内达到await,然后它本质上就是在Parallel.ForEach之外的即发即弃的调用。可能不是您想要的? -
只要异步命中每条记录,应该没问题。该方法是自给自足的,如果它失败了,它将被重新拾取处理。
-
@AlexJ,这样
Parallel.ForEach甚至可能在第一个e.Process()完成之前返回。例如,如果您在 ASP.NET 控制器方法中调用Parallel.ForEach,则 HTTP 响应可能会在任何e.Process()异步调用有机会完成之前发送到客户端。我真的想不出任何可以接受的场景。如果这仍然是你想要的行为,你不需要Parallel.ForEach,因为你不做任何CPU密集型的工作。只需使用常规的foreach即可开始您的即发即弃呼叫。
标签: async-await linq-to-objects c#-5.0