6

我想在我的项目 (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);
});

但是在产品类的构造函数中发生错误是

调用线程必须是 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 上方创建了产品对象,但仍然出现错误..

如何修复我的错误?

4

3 回答 3

8

简单的答案是您正在尝试使用需要单线程的组件,更具体地说,它们看起来只想在 UI 线程上运行。所以使用Parallel.For不会对你有用。即使您使用调度程序,您也只是将工作编组到单个UI 线程,这否定了Parallel.For.

于 2012-08-14T12:59:33.813 回答
3

您不能从后台线程与 UI 交互。

因此,您不能用于Parallel.For管理 UI。

于 2012-08-14T12:57:54.687 回答
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 所解释的那样,不会有任何好处。

于 2012-08-14T13:05:09.573 回答