非同期/待機とスレッド


100

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

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

2
スレッドと非同期/待機は無関係な機能です。それらを組み合わせることができますが、そうする必要はありません。
dtb 2013

2
Async / Awaitは同じことをしていると思いましたnew Thread(() => {Some Work}).Start();?!ですよね?
Roman Ratskey、2013年

2
いいえ。あなたの仮定は正しくありません。Async / Awaitと組み合わせることが多いTask.Run(TPL)を考えているかもしれませんが、これも無関係であり、使用する必要はありません。
dtb 2013

4
@dtb:したがって、Async / Awaitをいつ使用し、いつスレッドを使用するのですか?Task.Run、Thread.Start、Async / Awaitの違いについて本当に混乱しています。あなたが私にそれらの違いを理解させる良い説明を私に提供できれば、私は非常に感謝します
Roman Ratskey

2
Async / awaitは、スレッドを作成したり、他の方法でスレッドを使用したりしません。
wRAR 2013年

回答:


78

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

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

スレッドが非同期でできることは何でもできる?

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

WebClient.DownloadStringAsyncのようないくつかのメソッドでのみ使用できます

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


4
最近のC#の側面では、外部APIで非同期コールバックを実現するための最良のアプローチは何ですか?
bonCodigo

5
最後の段落で説明されているように、タスクを使用します。
Hans Passant 2015

例として、非同期プログラミングでは実行できない、スレッドでできることを期待します。
Saeed Neamati 2016年

1
「スレッドはさらに多くの便利なことを実行できます。」について詳しく教えてください。スレッドが提供するのasyncに適していない機能を理解しておくと役に立ちます。
Benjohn

1
await Task.RunCPUに縛られた作業について言及する価値がある。私が正しく理解していれば、スレッドやバックグラウンドワーカーを作成することでそれが実現することもあります。
ToolmakerSteve 2018年

15

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


これは、私がスレッドと非同期/待機について読んだ最初のリソースのように、明確で簡潔です。
Arman Bimatov

2
この回答には、ドキュメントへのリンクのみが含まれています。リンクが古くなる可能性があるため、回答も古くなる可能性があり、さらに悪いことに、完全に役に立たなくなる可能性があります。Stackのユーザーは、リンクの関連部分を質問に直接投稿することをお勧めします。
HimBromBeere

1
悲しいことに、公式声明はいつすべきかを説明していませんawait Task.Run。Task.Runについて簡単に触れていますが、明確ではありません。結論としては、awaitそれ自体ではCPUにバインドされたタスクを並列に実行しないため、そのような作業はを介して行う必要がありますawait Task.Run
ToolmakerSteve 2018年

1

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

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

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

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

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

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