与えられたタスクを達成するためにどちらかを使用する際の賛否両論は何ですか?BackgroundWorkerとスレッド
100万ドルの質問は、いつどのような質問をするのですか?
多くのありがとうございます。
与えられたタスクを達成するためにどちらかを使用する際の賛否両論は何ですか?BackgroundWorkerとスレッド
100万ドルの質問は、いつどのような質問をするのですか?
多くのありがとうございます。
私は、BackgroundWorkerをThreadsの処理のためのラッパーとして関連付けます。だから、私はGUIワークスでBackgroundWorkerを使用し、より特殊化されたジョブ(Windowsサービスなど)にはスレッドを使用します(Windowsサービスなど)
"Threads"によってSystem.Threading.Threadクラスを明示的に使用して独自のスレッドを作成、設定、開始することを意味する場合、これは自分のスレッドでより多くの作業が行われ、スレッドプールからスレッドを引っ張るだけで(他の方法とは異なります)、スレッド優先度やスレッドプールスレッドを使用して得られるいくつかの特性を指定できるため、柔軟性が向上します。
「スレッドプール」のアプローチは、設計時に必要なスレッドの数がわからない場合に適しています。プールには最初、少数のスレッドが含まれています。それらのスレッドを呼び出す準備ができています。オンデマンドで新しいスレッドを動的に作成し、未使用のスレッドの作成、調整、削除を管理します。プールからスレッドにアクセスして使用するには、3つのメカニズムがあります。 Delegate.BeginInvoke()(最も一般的な技術)を使用して
スレッドは、実行するときにUI UIを扱わなければならない。
UIとバックグラウンドワーカーの問題が個ありません。
BackgroundWorkerクラスは、フォームをUIにブロックせずに何らかの操作を実行するためにスレッドを追加する簡単な方法です。あなたはスレッドで同じことをすることができますが、もう少しコーディングが増えます。
はthis great threading overviewを見てください:
[BackgroundWorkerのは、以下の機能を提供し:
Aがアボート
- を使用せずに終了するワーカーをシグナリングするためのフラグを "キャンセル"
進捗状況、完了およびキャンセルを報告するための標準プロトコル
それはワーカースレッド
上の労働者の進捗や完了に応答してWindowsフォームとWPFのコントロールを更新する機能を扱うVisual Studioのデザイナ 例外で土地を選定することが可能IComponentの実装。
最後の2つの機能は特に有用である - それはあなたがあなたのワーカー方法でtry/catchブロックを含める必要はありませんし、Windowsフォームを更新し、WPFはControl.Invokeを呼び出すために必要とせずにコントロールできることを意味します。
BackgroundWorkerクラスは、UIスレッドのコンテキストに切り替えられるイベントを提供しますが、混同しないでください。 DoWorkイベント(実際にはうまく作業を行う場所)は、別のスレッドのコンテキストで実行されています(それが全体のポイントです)。UIのやりとりや更新を実行すると例外がスローされます最高で、最悪でもクラッシュします。 BackgroundWorkerは、UIの更新が必要なものや、スコープがフォームの範囲を超えないものを実行しようとしているときに、フォームで使用する必要があります。他のバックグラウンド操作では、ThreadPool(短命の操作の場合)または独自のThreadの作成を検討してください。
BackgroundWorkerはProgressChangedイベントの利便性を提供しますが、DoWorkでUI更新を開始しすぎることはありません。