我想在我的项目(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上面创建了产品对象,但我仍然得到错误..
如何修复错误?
答案 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解释不会有任何好处。