2017-10-27 16 views
9

次のスニペットでは、なぜReadAsStringAsyncは非同期メソッドですか? ReadAsStringAsync asyncはなぜですか?

var response = await _client.SendAsync(request); 
var body = await response.Content.ReadAsStringAsync(); 

は、もともと私は、インプロセスCPUの仕事(と本当に非同期に)なり、そのストリームを読んで、その時点でメモリに応答ストリームを要求を送信し、ロードするためにSendAsyncを期待しました。

は、ソースコードのウサギの穴を下に行く、私はこれに到着した:これは私が応答ストリームが実際に外部のいくつかのソースから読み込まれるまで、多分、接続が開いていることを思わせる

int count = await _stream.ReadAsync(destination, cancellationToken).ConfigureAwait(false); 

https://github.com/dotnet/corefx/blob/0aa654834405dcec4aaa9bd416b2b31ab8d3503e/src/System.Net.Http/src/System/Net/Http/Managed/HttpConnection.cs#L967

プロセスの?私は、Http Connectionsのストリームがどのように動作するかについて、いくつかの基本を見逃していると思っています。

+7

SendAsyncは、*ヘッダー*を受信するとすぐに戻ります。多くのKBやMBのサイズを持つことができる* content *を読む必要があります。 –

答えて

12

SendAsync()リクエストが完了し、への応答がに到着するのを待ちます。

応答全体をバッファリングしません。これにより、レスポンス全体をメモリに保持することなく、大きなレスポンスをストリーミングすることができます。

+0

https://docs.microsoft.com/en-us/windows/uwp/threading-async/call-asynchronous-apis-in-csharp-or-visual-basicへのリンクが良いかもしれません。応答性は、非同期メソッドを常に優先するための設計原則です。 –

+0

@LexLiこのリンクは質問または回答にどのように関連していますか? – Evk

+0

@Evk「非同期APIは、大規模な操作が完了するのを待ってからアプリケーションを実行し続ける前に、たとえばインターネットから情報をダウンロードするアプリは、情報が到着するのを数秒待つかもしれないあなたが同期メソッドを使用して情報を取得する場合、メソッドは返されるまでブロックされます。アプリケーションはユーザーのやりとりに応答せず、応答しないように見えるため、ユーザーは不満を感じる可能性があります。 –

関連する問題