【发布时间】:2019-11-29 12:06:58
【问题描述】:
在处理请求时使用Parallel.ForEach 是否正确?我问这个是因为 async task 旨在尽可能多地参加会议,而不是尽可能快,这是 Parallel.ForEach 会做的。
简单示例:
public async Task<OperationResult> ProcessApiRequest(List<string> ids)
{
Parallel.ForEach(ids, async (id) =>
{
await this.doStuff(id);
await this.doAnotherStuff(id);
});
return OperationResult.Success();
}
想象一下,我可以收到 1 个或 100 万个 id,并且我希望尽可能多地参与请求。由于我的线程将忙于处理 100 万个 id,它将难以处理与会者的新请求,对吗?
谢谢!
【问题讨论】:
-
Parallel.ForEach 用于数据并行,而不是并发操作。此呼叫将触发 1M
async void呼叫,没有人会等待。它几乎会立即返回,也许在任何请求有机会开始之前。编译器还会发出警告,ProcessApiRequest没有等待,将同时运行。 -
是的,这正是我所担心的。谢谢!
标签: c# api asynchronous .net-core parallel.foreach