Natknąłem się na ten post, który mówi o składaniu asynchronicznych żądań internetowych.
Odkładając na bok prostotę, jeśli w prawdziwym świecie wszystko, co robisz, to wykonujesz żądanie asynchroniczne i czekasz na nie w następnej linii, czy to nie to samo, co wykonywanie połączenia synchronicznego?
c#
.net
asynchronous-programming
Mrchief
źródło
źródło
Odpowiedzi:
Nie, z
async + await != sync
powodu kontynuacjiZ MSDN „Programowanie asynchroniczne za pomocą Async i Await (C # i Visual Basic)”
Na przykład wykonanie asynchroniczne nie blokuje wątku interfejsu użytkownika i
Some TextBox.Text
zostanie zaktualizowane po zakończeniu pobieraniaźródło
Console.WriteLine(await GetStringOverNetwork());
? Co jeśli potrzebujesz wyniku asynchronicznego wywołania? Czy program blokuje się przy pierwszym dostępie, nawet jeśli wątek mógłby potencjalnie kontynuować wykonywanie?Nie, to nie to samo.
Twój
async
blok kodu czeka naawait
wezwanie do powrotu, aby kontynuować, jednak reszta aplikacji nie czeka i może nadal jak zwykle.W przeciwieństwie do tego, wywołanie synchroniczne sprawi, że cała aplikacja lub wątek zaczekają, aż kod zakończy się, aby kontynuować działanie z czymkolwiek innym.
źródło
Pozwól, że wyjaśnię rzeczy dotyczące asynchronizacji / oczekiwania.
Po napotkaniu oczekiwania na maszynę stanową można natychmiast zwrócić kontrolę. Następnie, gdy oczekiwane połączenie zostanie zakończone, maszyna stanu bazowa umożliwia wznowienie wykonywania na linii po oczekiwaniu na połączenie.
Dlatego blok asynchroniczny nie jest blokowany ani nie czeka na zakończenie oczekiwanego połączenia; Kontrola jest zwracana natychmiast po napotkaniu polecenia oczekującego.
Podstawowa maszyna stanu jest częścią „magii” związanej z używaniem asynchronizacji / czekania, która nie jest nieużywana i pomijana.
źródło
Natknąłem się na to z myślą o tym samym pytaniu, ale po przeczytaniu odpowiedzi pytanie wydaje się pozostawać, pomieszane przez odniesienia do „magii pod maską”.
Z wyżej wspomnianego programowania asynchronicznego :
Czy kontekst, który napotyka,
await
zostaje zablokowany?Czy reszta aplikacji blokuje się przy
await
?To zależy od sposobu napisania aplikacji. Jeśli jest to seria zależnych
await
zadań ed uruchamianych sekwencyjnie w tym samym kontekście (patrz: Próbowanie zrozumienia pewnych zachowań asynchronicznych / oczekiwania )w ten sposób każdy
await
blokowałby odrodzenie następnego.Z drugiej strony, te same zadania zależne uruchamiane równolegle byłyby wykonywane równolegle, a kontekst blokowałby się tylko w odpowiednio.
await
:Zasadniczo
await
zwraca wykonanie do zewnętrznego kontekstu, z którego wywoływany jest bieżący kontekst. Jednakże, jeśli sam kontekst zewnętrzny oczekuje na prąd, to jest jak sekwencjaawait
s w tym samym kontekście.Tak więc, aby czerpać
async
korzyści, należy zaprojektować aplikację do uruchamiania kilku równoległych kontekstów (interfejs użytkownika, klient danych itp.), A następnieawait
w jednym kontekście daje wykonanie do innych kontekstów, aby cała aplikacja nie blokowała się na jednostceawait
.źródło