【发布时间】:2012-11-13 20:37:40
【问题描述】:
我有一个场景,我必须运行嵌套的 foreach 来创建一个列表。我所做的伪代码如下
foreach(var x in list) (ForEach1)
get m // List<string>
foreach(var k in m) (ForEach2)
get t // List<string>
foreach(var o in t) (ForEach3)
// Do some work. and add output to a list
// which is defined before first for each
但是,因为我在 Foreach2 和 Foreach3 中从外部系统(通过运行 Perforce 命令从 Perforce)检索数据,所以这段代码运行速度非常慢,我确实需要加快速度。
我尝试使用 Parallel.ForEach 并行运行 ForEach1 或 ForEach2。在我的测试中,它显着提高了性能,但产生了不准确的结果。
- 如果我使用 foreach 语句运行此代码,我生成的列表有 625 个项目(这是正确的)
- 如果我将 Parallel.ForEach 用于 ForEach1,我会在列表中添加 325,这远低于我的预期。
- 最后,如果我将 Parallel.ForEach 用于 ForEach2,我将 605 项添加到列表中,但仍有 20 项缺失。
我不确定我做错了什么,或者我错过了什么。使用并行 foreach 或 for 时需要考虑哪些事项?
谁能帮我解决一下?任何其他提高性能的建议将不胜感激
谢谢
【问题讨论】:
-
您是否尝试过使用 ForEach3 的并行版本?
-
听起来像是某种竞争条件。您为最终结果添加的集合是线程安全集合(例如 ConcurrentBag
)吗? -
@Taner ForEach3 是什么?
-
@flipchart 不是,但现在是,但没有任何改变,恐怕。
标签: c#-4.0 parallel-processing