レスポンシブUIは誰もが努力しているものであり、これを行うための推奨される方法は、BackgroundWorkerを使用することです。
扱いやすいと思いますか?よく使いますか?または、長いタスクとレポート作成プロセスのための独自のフレームワークがありますか。
私はそれをかなり頻繁に使用しており、ある種の進捗レポートが必要な場合はいつでもそのデリゲートを使用していることがわかりました。
レスポンシブUIは誰もが努力しているものであり、これを行うための推奨される方法は、BackgroundWorkerを使用することです。
扱いやすいと思いますか?よく使いますか?または、長いタスクとレポート作成プロセスのための独自のフレームワークがありますか。
私はそれをかなり頻繁に使用しており、ある種の進捗レポートが必要な場合はいつでもそのデリゲートを使用していることがわかりました。
マルチスレッド プログラミングは、最初のうちは把握するのが難しく (ベテランでも失敗することがあります)、BackgroundWorker を使用すると少し使いやすくなります。BackgroundWorker には実装が簡単で、キャンセルなどの微妙な方法で誤って実装しやすい機能があるという事実が気に入っています。進行状況の更新が必要な場合に使用して、意味のある進行状況バーを表示できるようにします。
そうでない場合は、Thread を使用します (または ThreadPool から借用します)。なぜなら、私は BackgroundWorker のすべての機能を必要とせず、Thread を開始して停止するのを待つのに十分なスレッドに習熟しているためです。
関連のないタスクのデリゲートについては、plain などの Thread クラスのデリゲートを使用するvoid ThreadStart()
か、独自のものを作成します。
BackgroundWorker を使用すると、作業がはるかに簡単になります。私が難しい方法を見つけたのは、スレッド切り替えの問題を隠すことになっているにもかかわらず、Backgroundworker 自体がスレッド アフィニティを持っていることです。すべての場合に自動的に UI スレッドに切り替わるわけではありません。スレッドの切り替えを適切に行うには、UI スレッドから作成して実行する必要があります。
進行状況の表示やバックグラウンド データの読み込み/処理などのタスクによく使用します。
最近、そのままではサポートされていないユースケースを見つけました。それは「オーバーライド可能なタスク」です。しかし、Patric Smacchia は素晴らしい解決策を思い付きました。
私は一度それを使用しましたが、それにはとても満足していました。多くの場合、「大きな」マルチスレッドは必要ありませんが、2 つのスレッド (UI とワーカー) のみが必要であり、基になるスレッド ロジックについてあまり心配する必要なく、非常にうまく機能します。
@Gulzarこの情報をありがとう:スレッドの切り替えを正しく行うには、UIスレッドから作成して実行する必要があります。
私が見つけたバックグラウンドワーカーを使用するときに注意すべきことの1つは、例外処理です。
非同期プロセスで例外がスローされた場合、メインスレッドに例外はスローされません。プロセスは終了し、BackgroundWorker RunWorkerCompletedイベントが発生し、エラーはRunWorkerCompletedEventArgs.Errorに隠されます。
BackgroundWorkerには、実装は簡単ですが、キャンセルなどの微妙な方法で誤って実装するのがさらに簡単な機能があるという事実が気に入っています。
バックグラウンド ワーカー クラスに関する私の最大の問題は、キャンセルによってワーカーがいつ終了したかを知る方法がないことです。BackgroundWorker は使用するスレッドを公開しないため、スレッドの終了 (結合など) を同期するための標準的な手法を使用することはできません。また、RunWorkerCompleted イベントが発生することは決してないため、UI スレッドのループ内でループが終了するのを待つこともできません。私が常に使用しなければならなかったハックは、単純にフラグを設定してから、バックグラウンド ワーカーが終了するのをチェックし続けるタイマーを開始することです。しかし、これは非常に面倒で、ビジネス ロジックを複雑にします。
したがって、決定論的なキャンセルをサポートする必要がない限り、これは素晴らしいことです。