113

.Net 4.5では、MicrosoftはAsync/Await非同期コーディングを簡素化するための新機能を追加しました。しかし、私は疑問に思います

  1. Async/Await古い使い方を完全に置き換えることは できますThreadsか?
  2. 非同期でできることはAsync/Await何でもできますか?Thread
  3. Async/Awaitのようないくつかのメソッドでのみ使用できますかWebClient.DownloadStringAsync、または同期メソッドを変換してAsync/Await、メインスレッドをブロックせずに使用できるようにすることはできますか?
4

3 に答える 3

84

スレッドを使用する古い方法を完全に置き換えることができますか?

いいえ。スレッドはもっと多くの便利なことをすることができます。Awaitは、時間がかかるもの、最も一般的にはI/Oリクエストを処理するように特別に設計されています。これは従来、I/O要求が完了したときにコールバックで実行されていました。これらのコールバックに依存するコードを書くことは非常に困難です。awaitはそれを大幅に単純化します。

スレッドが非同期で実行できることを実行できますか?

だいたい。Awaitは遅延の処理を処理するだけで、スレッドが行うことは何もしません。awaitキーワードの右側にあるawaitは、仕事を成し遂げるものです。理想的には、スレッドをまったく使用せず、ドライバーリクエストを送信し、ドライバーがデータ転送を完了すると、完了通知コールバックを生成します。ネットワークは断然最も一般的な使用法であり、数百ミリ秒の遅延が一般的であり、デスクトップまたはLANから「クラウド」に移動するサービスの避けられない副作用です。このようなサービスを同期的に使用すると、UIがまったく応答しなくなります。

WebClient.DownloadStringAsyncなどの一部のメソッドでのみ使用できます

いいえ。タスクを返す任意のメソッドで使用できます。XxxxAsync()メソッドは、時間がかかる一般的な操作のために.NETFrameworkで事前に作成されたメソッドです。Webサーバーからデータをダウンロードするようなものです。

于 2013-03-01T02:34:02.083 に答える
16

これに関する公式声明。ただし、あるものを他のものに盲目的に置き換える前に、スレッドと非同期プログラミングの違いを理解する必要があります。

于 2013-03-01T02:12:56.190 に答える
4

私はそれについてこのように考えています(そして、 https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443 (v = vs.110)を見ると、Microsoftもそう思います)#threads

Async / awaitは、メインアプリケーションスレッドでコードを実行する簡単な方法です。コードは、実行する作業がないときにコード自体を一時停止し、メインスレッドにフォーカスを戻し、メインスレッドで「ウェイクアップ」できるという利点があります。は取得する結果であり、処理をメインスレッドに戻します。これは、特定の実行行に制御を行き来できるBasicのイベントベースのGOTOステートメントのように考えてください。

対照的に、スレッドは、独自の変数などを使用して実行できる別個の実行ストリームです。ここで、十分なハードウェアがあれば、実行はメインスレッドと並行して行われます。

単一のファイルをダウンロードし、ダウンロード時にそのファイルで何かを実行するGUIアプリケーションがある場合は、async/awaitメソッドを使用して実装します。

ただし、GUIが5000ファイルをダウンロードする必要がある場合は、ファイルのダウンロードを処理するために実行が転送されるときにメインGUIスレッドがフリーズする可能性があるため、これを処理するファイルダウンロードスレッドを作成します。

于 2019-02-27T09:49:16.357 に答える