2

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

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

    return View(model);

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

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

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

4

1 回答 1

5

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

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

您可以通过 a) 为 DisplayModels 使用 Concurrent 集合或 b) 将 ForEach 转换为 PLINQ 查询来解决此问题。但是除非DisplayBoardModel()有一些繁重的 CPU 工作(并且 ctor 通常不会),否则使这种并行化毫无意义。

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


编辑,新信息

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

所以这是一个潜在的原因。每个 Db 操作是否都创建自己的连接(上下文)?有没有机会默默地忽略异常?

于 2013-02-07T13:17:55.597 回答