给定以下代码,可以在 Parallel.ForEach
中执行 async/await
吗?
例如。
Parallel.ForEach(names, name =>
{
// Do some stuff...
var foo = await GetStuffFrom3rdPartyAsync(name);
// Do some more stuff, with the foo.
});
或者是否有一些我需要注意的陷阱?
编辑:不知道这是否编译,顺便说一句。只是伪代码 .. 大声思考。
最佳答案
不,将 async
与 Paralell.Foreach
组合没有意义。
考虑以下示例:
private void DoSomething()
{
var names = Enumerable.Range(0,10).Select(x=> "Somename" + x);
Parallel.ForEach(names, async(name) =>
{
await Task.Delay(1000);
Console.WriteLine("Name {0} completed",name);
});
Console.WriteLine("Parallel ForEach completed");
}
您期望得到什么输出?
Name Somename3 completed
Name Somename8 completed
Name Somename4 completed
...
Parallel ForEach completed
这不会发生。它将输出:
Parallel ForEach completed
Name Somename3 completed
Name Somename8 completed
Name Somename4 completed
...
为什么?因为当 ForEach
首先命中 await
时,该方法实际上返回了, Parallel.ForEach
不知道它是异步的并且它运行到完成!。 await
之后的代码在另一个线程上继续运行不是“并行处理线程”
关于c# - 在某些 .NET Parallel.ForEach() 代码中执行一些异步/等待是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23729877/