c# - 在某些 .NET Parallel.ForEach() 代码中执行一些异步/等待是否可以?

标签 c# .net parallel-processing async-await parallel.foreach

给定以下代码,可以Parallel.ForEach 中执行 async/await 吗?

例如。

Parallel.ForEach(names, name =>
{
    // Do some stuff...

    var foo = await GetStuffFrom3rdPartyAsync(name);

    // Do some more stuff, with the foo.
});

或者是否有一些我需要注意的陷阱?

编辑:不知道这是否编译,顺便说一句。只是伪代码 .. 大声思考。

最佳答案

不,将 asyncParalell.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 之后的代码在另一个线程上继续运行不是“并行处理线程”

Stephen toub addressed this here

关于c# - 在某些 .NET Parallel.ForEach() 代码中执行一些异步/等待是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23729877/

相关文章:

c# - 在 FormattableString 和 (str, params object[]) 之间转换

c# - Glass.Mapper.Sc 默认全局设置 inferType 为 true

c# - 在包装 PInvoke 东西的属性的 get 函数中放置大量代码是不好的做法吗?

.net - 适用于 VB6 程序员的 Option Strict On 和 .NET

python - GNU Parallel 替换管道 xargs -n 1

javascript - 如何在mvc中自动重定向后删除特定历史记录

c# - 在 .NET 中返回数据的线程

.net - 如何在 .Net 中将小数四舍五入到小数点后两位?

c# - 是否有在后台线程上初始化对象的通用模式?

java - java中的并行编程作业