2017-10-27 117 views
9

W związku z tym dlaczego w ReadAsStringAsync zastosowano metodę asynchroniczną?Dlaczego ReadAsStringAsync async?

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

Początkowo spodziewałem SendAsync wysłać żądanie i załadować strumienia odpowiedzi do pamięci, w którym momencie czytania tego strumienia byłoby pracę procesora w procesie (i naprawdę nie asynchroniczny).

Schodząc otwór kod źródłowy królik, przyjechałem w tym:

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

To sprawia, że ​​myślę, że być może połączenie jest otwarte aż strumień odpowiedzi jest faktycznie odczytać z jakiegoś źródła zewnętrznego procesu? W pełni oczekuję, że brakuje mi pewnych podstaw dotyczących działania strumieni z Http Connections.

+7

Funkcja SendAsync zwraca natychmiast po otrzymaniu * nagłówków *. Nadal musisz przeczytać * zawartość *, która może mieć wiele KB lub MB. –

Odpowiedz

12

SendAsync() czeka na zakończenie żądania, a odpowiedź na rozpoczyna się przybywających.

Nie buforuje całej odpowiedzi; pozwala to na strumieniowanie dużych odpowiedzi bez zatrzymywania całej odpowiedzi w pamięci.

+0

Może link do https://docs.microsoft.com/en-us/windows/uwp/threading-async/call-asynchronous-apis-in-csharp-or-visual-basic będzie lepszy. Responsywność jest tutaj zasadą projektowania, aby zawsze preferować metody asynchroniczne. –

+0

@LexLi jak ten link jest odpowiedni do pytania lub odpowiedzi? – Evk

+0

@Evk tylko kilka pierwszych akapitów jest powiązanych, np. "Asynchroniczne interfejsy API uniemożliwiają Twojej aplikacji oczekiwanie na zakończenie dużych operacji przed kontynuowaniem wykonywania. Na przykład aplikacja pobierająca informacje z Internetu może poświęcić kilka sekund na oczekiwanie na dotarcie informacji Jeśli użyjesz metody synchronicznej do pobrania informacji, aplikacja zostanie zablokowana do czasu powrotu metody. Aplikacja nie zareaguje na interakcję z użytkownikiem, a ponieważ wydaje się, że nie odpowiada, użytkownik może zostać sfrustrowany. " –