c#中的Parallel.for不起作用

c#中的Parallel.for不起作用,c#,parallel-processing,C#,Parallel Processing,我编写了Wpf代码来使用随机变量生成正态分布 using System.Threading.Tasks; using System.Threading; private void Button_Click(object sender, RoutedEventArgs e) { ..... for (int t = 0; t < normalx.Count; t++) { normaly.I

我编写了Wpf代码来使用随机变量生成正态分布

using System.Threading.Tasks;
using System.Threading;


private void Button_Click(object sender, RoutedEventArgs e)
        {            .....


for (int t = 0; t < normalx.Count; t++)
            {
                normaly.Insert(t, (2 / ((Math.Pow(2 * Math.PI, 0.5)) * rmsnormalvalue)) * Math.Exp(-0.5 * Math.Pow(standardnormalx.ElementAt(t), 2)));
            }

...


}

但构建是可以的,但在运行时只有一个线程区域(
normalx.Count/8
TPL不能保证它将为并行循环使用给定数量的线程。它能够,但它可能会确定,由于循环中要完成的工作量太大,而只在单个线程上运行,因此启动额外线程的开销太大

执行for循环,迭代可以在其中并行运行

(强调矿山)

通过提供自定义分区器,您可以强制多个线程(强制并不一定是一个好主意),但我还没有尝试过

TPL仍然可以自由地说“很好,您提供了一个自定义分区器,但我仍然将在一个线程上顺序执行每个分区”。我不知道当前的实现在这方面的表现如何

更新

重新阅读并检查Henk的评论,我不确定我第一次是否正确阅读了你的问题

你是说只计算了一些法线吗?如果是这样,那可能是因为支持
normaly
的任何集合都不是线程安全的


如果是这种情况,您可以进行计算,将其分配给一个临时变量,然后对实际插入使用
。这会造成插入集合的瓶颈,但您仍然可以获得并行计算。

几乎可以肯定的是
normaly.insert(t,…)
不是线程安全的,也不可能是您想要执行的操作。您要做的是提前创建一个包含所有所需插槽的空白数据结构,然后用并行循环填充它们。下面是您可以执行的方法:

var temp = new double[normalx.Count];
Parallel.For(0, normalx.Count, t =>
    temp[t] = 2 / ((Math.Pow(2 * Math.PI, 0.5)) * rmsnormalvalue)) *
              Math.Exp(-0.5 * Math.Pow(standardnormalx.ElementAt(t), 2));
normaly = temp.ToList();

什么是
normaly
,它是线程安全的吗?这会改变输入/输出的区域吗?@Henk:我可能误解了这个问题。更新了我的答案。
var temp = new double[normalx.Count];
Parallel.For(0, normalx.Count, t =>
    temp[t] = 2 / ((Math.Pow(2 * Math.PI, 0.5)) * rmsnormalvalue)) *
              Math.Exp(-0.5 * Math.Pow(standardnormalx.ElementAt(t), 2));
normaly = temp.ToList();