4

MSDN には、次のような段落があります。

async および await キーワードによって、追加のスレッドが作成されることはありません。非同期メソッドは独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。メソッドは現在の同期コンテキストで実行され、メソッドがアクティブな場合にのみスレッドで時間を使用します。Task.Run を使用して、CPU バウンドの作業をバックグラウンド スレッドに移動できますが、バックグラウンド スレッドは、結果が利用可能になるのを待っているだけのプロセスには役立ちません。

しかし、太字のテキストが正確に何を意味するのかわからないため、もう少しヘルプが必要なようです。では、なぜ使わないとasyncならないのThreadsでしょうか。

ソース: http://msdn.microsoft.com/en-us/library/hh191443.aspx

4

4 に答える 4

11

複数のスレッドを使用する必要のない多くの非同期操作があります。非同期IOのようなものは、データが利用可能になったときに通知する割り込みを持つことで機能します。これにより、余分なスレッドを使用しない非同期呼び出しを行うことができます。シグナルが発生すると、操作が完了します。

Task.Run独自の別のスレッドで実行される独自の CPU ベースの非同期メソッドを作成するために使用できます。ただし、この段落は、これが唯一の選択肢ではないことを示すことを目的としていました。

于 2012-09-05T01:12:42.077 に答える
3

async/await は、より多くのスレッドを使用するだけではありません。持っているスレッドをより効果的に使用することです。ダウンロードやファイルの読み取りの待機など、操作がブロックされている場合、async/await パターンを使用すると、その既存のスレッドを別の用途に使用できます。コンパイラは、その下にあるすべての魔法の配管を処理するため、開発がはるかに簡単になります。

問題の説明とホワイトペーパーについては、http: //msdn.microsoft.com/en-us/magazine/hh456401.aspxを参照してください。 14058 .

于 2012-09-05T01:20:17.220 に答える
2

async および await キーワード自体によって生成されたコードではありません。同期コンテキストがあると仮定して、現在のスレッドで実行されるコードを作成します。そうでない場合は、実際にスレッドを取得しますが、それは正当な理由もなくパターンを使用しています。await キーワードの右側に記述した await 式により、スレッドが実行されます

しかし、そのスレッドは多くの場合、監視できず、デバイス ドライバー スレッドである可能性があります。これは、I/O 完了ポートで行われることを報告します。かなり一般的ですが、I/O は常に await を使用する正当な理由です。WinRT によってまだ強制されていない場合は、async/await が追加された本当の理由です。

「同期コンテキストを持つ」ことについてのメモ。SynchronizationContext.Current プロパティが null でない場合は、スレッドに 1 つ存在します。これはほとんど、GUI アプリのメイン スレッドでのみ発生します。また、ユーザー インターフェイスがフリーズせずに遅延が発生することを通常心配する唯一の場所でもあります。

于 2012-09-05T01:25:07.353 に答える
1

async基本的に、メソッドを呼び出さずにメソッドを実行すると、次のようになりますawait

  1. メソッドを開始し、可能な限り同期して実行します。

  2. 必要に応じて、メソッドを一時停止し、残りを継続します。

  3. 非同期部分が完了したら (もう待機されていません)、継続を同じスレッドで実行するようにスケジュールします。

  4. 必要なものは何でも、このスレッドで通常どおり実行できます。Task非同期メソッドから返されたものを調べたり操作したりすることもできます。

  5. スレッドが使用可能になると、残りのメソッドが実行されます。

「非同期部分」は、呼び出し元のコードがこのタスクの完了を待機できる限り、ファイル IO、Web 要求、またはほとんど何でもかまいません。これには別のスレッドが含まれますが、これに限定されません。Reed Copsey が指摘したように、割り込みなど、非同期操作を実行する方法は他にもあります。

于 2012-09-05T01:16:02.747 に答える