【发布时间】:2020-07-14 08:40:16
【问题描述】:
我有一些关于 Parallel.ForEach 与分区方法的基本问题,我遇到了一些问题,所以我想了解这段代码是如何工作的以及它的流程是什么。
代码示例
var result = new StringBuilder();
Parallel.ForEach(Enumerable.Range(1, 5), () => new StringBuilder(), (x, option, sb) =>
{
sb.Append(x);
return sb;
}, sb =>
{
lock (result)
{
result.Append(sb.ToString());
}
});
与上述代码相关的问题:
-
他们是否在并行 foreach 中做一些分区工作?
-
当我调试代码时,我可以看到代码的迭代(执行)发生了 5 次以上,但据我所知,它应该只触发 5 次 -
Enumerable.Range(1, 5)。 -
这段代码什么时候触发?在
Parallel.Foreach和Parallel.For中都有两个由{}分隔的块。这两个块如何执行并相互交互?
lock (result)
{
result.Append(sb.ToString());
}
奖金问题:
请参阅此代码块,其中没有发生 5 次迭代,而是发生了更多迭代。当我使用 Parallel For 而不是 foreach 时。查看代码并告诉我哪里出错了。
var result = new StringBuilder();
Parallel.For(1, 5, () => new StringBuilder(), (x, option, sb) =>
{
sb.Append("line " + x + System.Environment.NewLine);
MessageBox.Show("aaa"+x.ToString());
return sb;
}, sb =>
{
lock (result)
{
result.Append(sb.ToString());
}
});
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c# partitioning parallel.foreach