我正在用 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/