0

次のコードがあります。

    private void _DoValidate(object sender, DoWorkEventArgs e)
    {
        this.BeginInvoke(new MethodInvoker(() =>
        {
            Parallel.ForEach
                (this.listView2.CheckedItems.OfType<ListViewItem>(),
                new ParallelOptions { MaxDegreeOfParallelism = 4 },
                (item) =>
                {
                    List<string> data = new List<string>();
                    for (int s = 1; s < 5; s++)
                    {
                        if (item.SubItems[s].Text != null)
                            data.Add(item.SubItems[s].Text);
                        else
                            data.Add("");
                    }
                    this.BeginInvoke((Action)(delegate()
                    {
                        bool verified = checkdata(data);
                        item.Checked = verified;
                    }));
                });
        }));
    }

これは機能していますが、すべてのタスクが完了した後に GUI を更新しています。タスクの実行中にGUIを使用できるように、バックグラウンドワークを追加しました。

最終的に検証されたらすぐにリストビューアイテムを更新するようにこの関数を作成するにはどうすればよいですか?

4

2 に答える 2

1

あなたの問題は、UIスレッドですべてをキューに入れるだけだと思います。この行が正確に何をするのかわかりません

this.BeginInvoke(new MethodInvoker(() =>

UIスレッドで何かを実行しているようです。

Parallel.ForEach も UI スレッドで実行され、最終的に呼び出しを行ういくつかのワーカー スレッドに分岐します。

this.BeginInvoke((Action)(delegate()

これは、Parallel.ForEach メソッドが返されるまで実行されません (すべてのワーカー スレッドが最初に終了するのを待ちます) が、UI スレッドでも実行されます。

私がお勧めするのは、BackgroundWorker を使用するか、Task.Factory.StartNew を呼び出すだけで、ワーカー スレッドで Prallel.ForEach を実行することです。

于 2012-06-21T12:35:45.633 に答える
0

4.0 を使用する場合は、Task.ContinueWithコンストラクトを利用できます。

このようにして、すべてのタスクでContinueWithUI の更新を実行します。

お役に立てれば。

于 2012-06-21T12:13:36.267 に答える