0

ユーザーがタスクを追加できるリストビューを含むフォームがあります。次に、ユーザーはボタンをクリックして、アプリケーションがリストビューの各タスクを1つずつ実行して実行します。

これらのタスクは、実際にタスクを完了する命令に似ています。これを行うには、各アイテムを通過するループを含むクラスを作成し、各アイテムに設定したタスク(命令)を完了します。解析を開始するために、その関数を呼び出すフォームにボタンがあります。IE:RunTask(listview1、1)-基本的に、これはすべて、指定されたリストビューと開始するアイテムを使用して、クラスにあるループを開始します。

画面がロックされることを除いてすべてが完璧に機能するため、アプリケーションがこれらのリストビューアイテムを解析するのを停止する停止機能を実装することはできません。個別に実行したいスレッドは常にこのリストビューにアクセスするため、クロススレッドなしでこれを実装する方法がわかりません。リストビューを削除するためにプログラムを再設計することは現実的ではありません。私はapplication.doeventsを試しましたが、それはあまりにも多くのバグを引き起こしました。私はこれを修正する方法について何日も研究してきましたが、私にはわかりません。うまくいけば、誰かが光を当てることができます。

また、この問題を解決するためにバックグラウンドワーカーをすでに追加しましたが、明らかにcheckforillegalcrossthreadcalls = falseに設定する必要があり、これは賢明ではないことはわかっています。

4

1 に答える 1

0

このようなことをしてみてください。リストビューを取得して、UIに関連しない値のセットに変換します。このような:

        string[] values =
            this
                .listView1
                .Items
                .Cast<ListViewItem>()
                .Select(x => x.Text)
                .ToArray();

次に、並列タスクライブラリを使用して、タスクをバックグラウンドで実行できます。

        var tokenSource = new System.Threading.CancellationTokenSource();
        var token = tokenSource.Token;

        var task = System.Threading.Tasks.Task.Factory
                .StartNew(() => RunTasks(values, 1), token);

タスクをキャンセルする必要がある場合は、次のように実行できます。

        tokenSource.Cancel();

ただし、タスクの終了時にUIの更新を処理するには、次のようにします。

        task.ContinueWith(r =>
        {
            /* When compete code */
        });

UIスレッドに反映されるように、必ずUI更新を呼び出してください。

これをVB.NETで作成しなかったことをお詫びします。私のVBは錆びてきています。

于 2012-09-05T05:11:23.237 に答える