c# - C# Parallel.ForEach 的工作何时完成?

标签 c# multithreading concurrency asp.net-mvc-4 parallel-processing

我正在用 C# 开发一个 MVC4 网站。以下代码应在将所有内容传递到 View 之前用项目填充 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 效果很好

最佳答案

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

但是您的 model.DisplayModels.Add() 可能不是线程安全的。您使用什么集合?

您可以通过 a) 使用 DisplayModels 的并发集合或 b) 将 ForEach 转换为 PLINQ 查询来解决此问题。但除非 DisplayBoardModel() 执行一些繁重的 CPU 工作(而 ctor 通常不会执行),否则进行并行处理没有什么意义。

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


编辑,新信息

each DisplayBoardModel make a database request

所以这是一个潜在的原因。每个数据库操作都会创建自己的连接(上下文)吗?异常是否有可能被默默忽略?

关于c# - C# Parallel.ForEach 的工作何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14751916/

相关文章:

java - Hibernate查询缓存并发策略

c# - 这个 Xamarin 自定义渲染器教程中的 CameraOptions 类型是什么?

multithreading - Python多线程模型

Java "unstopped "执行/完成线程

java - 我是否正确理解了 JSR-133 Cookbook 中的 Can Reorder 规则?

c++ - 发布获取语义以计算平均值

c# - 使用 Windows 兼容包创建 .net 核心 Windows 服务

c# - 我什么时候应该注销系统事件以防止内存泄漏?

c# - 如何清除浏览器后退按钮点击 MVC4 中的浏览器缓存?

python - Python:同时执行多个无限循环