BackgroundWorkerとAsync / Await


16

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

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

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

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


回答:


10

を使用してタスクを達成できますBackgroundWorker。これはよく知られたクラスであり、多くの人が使用しています。

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

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


13

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

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

言い換えれば、async/ awaitTask-Based Asynchronous Patternの拡張です。多くのサンプルを含む多くの情報がここにあります

BackgroundWorker使用して1つのバックグラウンドスレッドを作成し、WinFormsのコンポーネントでイベントベースの非同期パターンを、あなたはで独自のコードを使用してこのバックグラウンドスレッドで実行される作業移入できるDoWorkイベントハンドラを。一般に、Microsoftはこのパターンの使用を推奨していませんここのページの下部を参照)。ただし、既にこのパターンに慣れている場合は、まだ簡単なオプションかもしれません。

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


Win 8 APIと言うとき、それは非同期機能がWindows 7(ターゲットプラットフォーム)で十分にサポートされていないことを意味しますか?
robert.ecot

1
こんにちはRobert、非同期を使用するWin 8 .NET API(「Metro」スタイルのアプリ用)で、ファイルI / Oからダイアログボックスの表示まで、すべてを待ち望んでいます。FileStreamなどの他の.NETコンポーネントでは、Stream.ReadAsyncなどのメソッドでasync / awaitを使用することもできます。したがって、Win 8以外にもいくつかのサポートがあります。
ケビンマコーミック

素晴らしい、更新されたリンクもありがとう!非常に役立ちます。
robert.ecot

1
そのページBackgroundWorkerには、特にが推奨されていることを示すものは何もありません。
キラレッサ

また、Async VS BackgroundWorkerを読むこと、およびO'Reillyが発行した同名の本の著者であるStephen ClearlyのC#での並行プログラミングに関する一連のブログ投稿を読むことをお勧めします。
セントーザ

3

私はそれを言うだろうasync- awaitよりもはるかに柔軟ですBackgroundWorker。そして、もしあなたが適合する何かをしたいならBackgroundWorker、あなたもasync- awaitより読みやすく、よりタイプセーフなコードでそれをすることができます。

そのため、私はあなたが使用して好むべきだと思いますasync- await以上BackgroundWorker

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