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);
});

しかし、producd クラスのコンストラクタでエラーが発生します。

多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。

それでは、 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

スレッドに関する他の回答を言い換えることはしません.2番目のコードの修正バージョンを提供しているだけです:

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 に答える