BackgroundWorkerのタスク並列ライブラリの置き換え?


83

タスク並列ライブラリには、BackgroundWorkerクラスの置き換えまたは改善と見なされるものがありますか?

ウィザードスタイルのUIを備えたWinFormsアプリケーションがあり、長時間実行されるタスクを実行します。標準のプログレスバーと操作をキャンセルする機能を備えたレスポンシブUIを使用できるようにしたいと考えています。以前にBackgroundWorkerでこれを実行しましたが、代わりに使用できるTPLパターンがいくつかあるかどうか疑問に思っています。


回答:


91

Taskクラスはの改良ですBackgroundWorker。ネスティング(親/子タスク)を自然にサポートし、新しいキャンセルAPI、タスクの継続などを使用します。

私のブログには、古いBackgroundWorkerやり方と新しいTaskやり方を示す例があります。構文がかなり扱いにくいので、進行状況を報告する必要があるタスク用の小さなヘルパークラスがあります。この例では、結果値、エラー状態、キャンセル、および進行状況のレポートについて説明します。


彼は技術的に正しい答えであるため、これとハッチの答えのどちらを選ぶかは難しい。しかし、あなたのブログは新しいTaskクラスの使用方法を示しており、それが私が本当に探していたものです。BackgroundWorkerからの進化です。私はあなたの例を私のアプリケーションのコードの基礎として使用しています。
キースG

2
数日前、私はさまざまなバックグラウンド処理技術の比較を書きました。ネストBackgroundWorkerTask許可しながら、進行状況のレポートが簡単になります。2つのうち、私は好みますTask(ネストを許可するよりも、進行状況レポートをクリーンアップする方がはるかに簡単です)。ただし、どちらも他の一般的なソリューションよりもはるかに進んでいます。Threadまたはを使用している人の話を聞くと、私はしわがれThreadPool.QueueUserWorkItemます。これらは、バックグラウンドタスクに正しく使用するのが絶対に最も困難です。
スティーブンクリアリー2010

より簡単な進捗レポート?パーセンテージを報告したいすべての場合のみ。他のものを報告するには、begininvokeまたはSynchronizationContextが必要です。醜さを
投稿

5
@PanagiotisKanavos:任意のオブジェクトをuserState。として渡すことができます。ただし、前回のコメントから2。5年間で、とTaskが追加されました。これらは、の進行よりもクリーンで簡単です。最近のコードでは、もう使用する理由はまったくありません。IProgress<T>Progress<T>BackgroundWorkerBackgroundWorker
Stephen Cleary 2013

ええ、私はちょうど気づきました。どういうわけか、新しい質問を見つけるためにTPLタグをクリックしたときに、この投稿が一番上に来ました!
Panagiotis Kanavos 2013

23

バックグラウンドワーカーは、これを実現するための有効な方法です。複数の大規模な操作を同時に実行している場合は、並列拡張を検討する価値があります。それが1つだけの場合は、バックグラウンドワーカーを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.