web-dev-qa-db-ja.com

BackgroundWorker対Async / Await

私はC#開発に不慣れで、より応答性の高いUIを作成したいと考えています。私の予備調査では、これを達成するための2つの方法を見てきました。

  1. BackgroundWorkerクラスと組み合わせたマルチスレッド。
  2. 新しい非同期/待機修飾子。

新しいということは、より良いという意味ですか? 2つの方法の違いは何ですか?新しいプロジェクトを作成したい場合、どの方法を選択すればよいですか?

編集:多分私は指定する必要があります。私はWindowsフォームアプリケーションを作成しています。このアプリケーションでは、必要なすべてのデータがローカルディスクに保存/ロードされます。また、いくつかのUSBデバイスと通信します。

17
robert.ecot

BackgroundWorkerを使用してタスクを実行できます。よく知られているクラスで、多くの人が利用しています。

新しいC#5のasyncおよびawaitキーワードは、基本的に、読み取り可能な非同期コードを簡単に記述できるようにします。 BackgroundWorkerではなく、これらのキーワードを使用してさまざまなタスクを実行する方法のチュートリアルや例が少ない場合があります。

古いバージョンのC#を使用する必要がない限り、asyncawaitの使用方法を学ぶことをお勧めします。

10
M. Dudley

asyncおよびawaitキーワードを使用しても、アプリケーション自体の応答性は向上しません。それらは単にTaskオブジェクトを返すメソッドの呼び出しと処理をより便利にします。 async/awaitが実際にバックグラウンドスレッドを使用するようにするには、次のような使用方法と組み合わせる必要があります。

  • Task.Start()-TaskSchedulerを使用して特定のタスクを開始します。
  • PLINQ-一連の操作を並行して実行し、タスクを返します。
  • TaskCompletionSource-非同期タスクを処理するカスタム方法。これを使用した1つの場所は、WebBrowserコントロールからのイベントを処理することでした。
  • Win 8 APIの関数の多くなど、他のasyncメソッド。

つまり、async/awaitは、タスクベースの非同期パターンの拡張です。多くのサンプルを含む大量の情報を見つけることができます here

BackgroundWorkerは、 Event-Based Asynchronous pattern を使用して1つのバックグラウンドスレッドを作成するWinFormsコンポーネントであり、DoWorkイベントハンドラーで独自のコードを使用して、このバックグラウンドスレッドで行われた作業にデータを入力できます。一般的に、Microsoftはこのパターンの使用を推奨していません(ページの下部 here を参照してください)。シンプルなオプションである。

言及されていない別のオプションは、 Reactive Extensions for .NET です。これは、アプリに応答性を追加するためのもう1つの優れたフレームワークです。

14
Kevin McCormick

async-awaitBackgroundWorkerよりもはるかに柔軟性があると思います。そして、BackgroundWorkerに適合するものを実行したい場合は、async-awaitを使用して、より読みやすく、タイプセーフなコードを使用することもできます。

そのため、asyncよりもawait-BackgroundWorkerを使用することをお勧めします。

3
svick