gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:49:34 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com