如何使用Parallel.For?

时间:2012-08-14 12:56:16

标签: c# parallel-for

我想在我的项目(WPF)中使用并行编程。这是我的for循环代码。

for (int i = 0; i < results.Count; i++)
{
    product p = new product();

    Common.SelectedOldColor = p.Background;
    p.VideoInfo = results[i];
    Common.Products.Add(p, false);
    p.Visibility = System.Windows.Visibility.Hidden;
    p.Drop_Event += new product.DragDropEvent(p_Drop_Event);
    main.Children.Add(p);
}

它没有任何问题。我想用Parallel.For编写它,我写了这个

Parallel.For(0, results.Count, i =>
{
    product p = new product();
    Common.SelectedOldColor = p.Background;
    p.VideoInfo = results[i];
    Common.Products.Add(p, false);
    p.Visibility = System.Windows.Visibility.Hidden;
    p.Drop_Event += new product.DragDropEvent(p_Drop_Event);
    main.Children.Add(p);
});

但是在producd类的构造函数中出现的错误是

调用线程必须是STA,因为许多UI组件都需要这个。

然后我使用了Dispatcher。这是代码

Parallel.For(0, results.Count, i =>
{
    this.Dispatcher.BeginInvoke(new Action(() =>
        product p = new product();
        Common.SelectedOldColor = p.Background;
        p.VideoInfo = results[i];
        Common.Products.Add(p, false);
        p.Visibility = System.Windows.Visibility.Hidden;
        p.Drop_Event += new product.DragDropEvent(p_Drop_Event);
        main.Children.Add(p)));
});

由于我的“p”对象,我收到错误。它期望“;”它也说产品类;类名在此时无效。然后我在Parallel.For上面创建了产品对象,但我仍然得到错误..

如何修复错误?

3 个答案:

答案 0 :(得分:8)

简单的答案是,您正在尝试使用需要单线程的组件,更具体地说,它看起来只是想在UI线程上运行。因此使用Parallel.For对您没有用。即使您使用调度程序,您也只是将工作整理到单个 UI线程,否定了Parallel.For的任何好处。

答案 1 :(得分:3)

您无法从后台线程与UI进行交互。

因此,您无法使用Parallel.For来管理用户界面。

答案 2 :(得分:3)

我不会解释有关线程的其他答案,我只是提供第二段代码的固定版本:

Parallel.For(0, results.Count, i =>
    this.Dispatcher.BeginInvoke(new Action(() =>
        {
            product p = new product();
            Common.SelectedOldColor = p.Background;
            p.VideoInfo = results[i];
            Common.Products.Add(p, false);
            p.Visibility = System.Windows.Visibility.Hidden;
            p.Drop_Event += new product.DragDropEvent(p_Drop_Event);
            main.Children.Add(p);
        })));

但是Coding Gorilla解释不会有任何好处。