非同期Web要求の作成について説明しているこの投稿を見つけました。
さて、単純さはさておき、現実の世界であなたがすることは非同期リクエストを作成して次の行でそれを待つことだけです、そもそも同期呼び出しをするのと同じではないでしょうか?
非同期Web要求の作成について説明しているこの投稿を見つけました。
さて、単純さはさておき、現実の世界であなたがすることは非同期リクエストを作成して次の行でそれを待つことだけです、そもそも同期呼び出しをするのと同じではないでしょうか?
回答:
いいえ、継続のasync + await != sync
ため
MSDNの「AsyncとAwaitを使用した非同期プログラミング(C#とVisual Basic)」
非同期メソッドは、非ブロッキング操作を目的としています。非同期メソッドのawait式は、待機中のタスクの実行中に現在のスレッドをブロックしません。代わりに、式はメソッドの残りを継続としてサインアップし、asyncメソッドの呼び出し元に制御を返します。
たとえば、非同期実行はUIスレッドをブロックせずSome TextBox.Text
、ダウンロードの完了後に更新されます
private async void OnButtonClick()
{
SomeTextBox.Text = await new WebClient().DownloadStringTaskAsync("http://stackoverflow.com/");
}
Console.WriteLine(await GetStringOverNetwork());
?非同期呼び出しの出力が必要な場合はどうなりますか?スレッドが実行を継続できる可能性がある場合でも、プログラムは最初のアクセスでブロックしますか?
いいえ、同じではありません。
あなたasync
のためのコードブロックが待機しているawait
通話が継続して返すために、しかし、あなたのアプリケーションの残りの部分は待っていないと、まだ通常のように続けることができます。
対照的に、同期呼び出しは、コード全体の実行が完了するまでアプリケーションまたはスレッド全体を待機させ、他の処理を続行します。
私は同じ質問を念頭に置いてこれを見つけましたが、回答を読んだ後、質問は「フードの下の魔法」への参照と混同して長引くようです。
上記の非同期プログラミングから :
async
キーワードは、あなたが使用することを可能にする非同期メソッド、メソッドになりawait
、その本体にキーワードを。- 場合は
await
キーワードが適用され、それが呼び出すメソッドを中断し、待望のタスクが完了するまで、収量は呼び出し元に戻って制御します。await
async
メソッド内でのみ使用できます。
遭遇したコンテキストはawait
ブロックされますか?
アプリケーションの残りはブロックしawait
ますか?
それはあなたのアプリケーションがどのように書かれているかによります。await
同じコンテキストで順番に起動される一連の依存edタスクの場合(「非同期/待機の動作を理解しようとする」を参照)
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
この方法では、それぞれawait
が次のスポーンをブロックします。
一方、並行して起動された同じ依存タスクは並行して実行され、コンテキストは応答時にのみブロックされます。await
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
一般に、await
現在のコンテキストが呼び出される場所から外部コンテキストに実行をもたらします。ただし、外側のコンテキスト自体が現在のコンテキストを待機している場合はawait
、同じコンテキストのシーケンシャルsに似ています。
そのため、async
利点を享受するには、複数の並列コンテキスト(UI、データクライアントなど)を実行するようにアプリケーションを設計する必要があり、1つawait
のコンテキストで他のコンテキストへの実行が得られるため、アプリケーション全体が個々でブロックされませんawait
。