GUI スレッドのロックを回避するために、別のスレッドで実行する必要がある時間のかかるタスクがあります。このタスクが進行すると、特定の GUI コントロールが更新されます。
問題は、タスクが終了する前にユーザーが GUI の別の部分に移動する可能性があることです。その場合、次のことを行う必要があります。
- 進行中のタスクをキャンセルします (アクティブな場合)
- キャンセルが完了するまで待ちます。時間のかかるタスクの目的は特定のコントロールを更新することであるため、これは非常に重要です。複数のスレッドが同時にそれを実行しようとすると、事態が混乱する可能性があります。
- タスクを最初から起動する
具体的な例として、フォームに 2 つの部分があるとします。1 つはディレクトリ ツリーをナビゲートする部分で、もう 1 つはサムネイルを表示する部分です。ユーザーが別のディレクトリに移動すると、サムネイルを更新する必要があります。
BackgroundWorker
最初は aと anを使ってキャンセル待ちをしようと思ったのですAutoResetEvent
が、キャンセル時に行き詰ってしまったので何かを間違えたのでしょう。次に、BGW およびより原始的なメカニズムを置き換えることになっている TPL について読みました。
これは TPL を使用して簡単に実行できますか?