什么时候C#Parallel.ForEach的工作完成了?

Vaz*_*aze 2 c# parallel-processing concurrency multithreading asp.net-mvc-4

我正在用C#开发一个MVC4网站.ConcurrentBag在将所有内容传递给视图之前,以下代码应该使用项填充(DisplayModels).

    Parallel.ForEach(model.Products, p =>
    {
        model.DisplayModels.Add(new DisplayBoardModel()
        {
            Market = model.Market,
            Product = p
        });
    });

    return View(model);
Run Code Online (Sandbox Code Playgroud)

我发现在任何给定的执行中,DisplayModels似乎被填充到不同的点.好像ForEach在每个后台任务返回之前完成.

Parallel.ForEach对它的理解是,它并行处理每个项目,但仍然阻止了调用线程,直到完成所有工作.这不正确吗?

在模型准备好之前,我还应该做些什么来阻止动作返回吗?使用正常foreach工作正常

Hen*_*man 5

Parallel.ForEach()工作正常,并完成预期的一次.

但是你model.DisplayModels.Add()可能不是线程安全的.你用的是什么系列?

您可以通过以下方法解决此问题:a)使用DisplayModel的Concurrent集合或b)将ForEach转换为PLINQ查询.但是,除非DisplayBoardModel()一些繁重的CPU工作(并且ctor通常不工作),否则没有必要使这种并行.

所以,只需使用一个简单的 foreach()


编辑,新信息

每个DisplayBoardModel发出一个数据库请求

所以这是一个潜在的原因.每个Db操作都会创建自己的Connection(Context)吗?是否有机会忽略异常?