Próbuję znaleźć najlepszą praktykę dla jednego z moich projektów. Jest to typowa aplikacja WPF z interfejsem użytkownika, który wyświetla listę elementów i istnieje usługa danych, która zwraca wynik.Async await vs GetAwaiter(). GetResult() i wywołanie zwrotne
Dzwonimy do usługi asynchronicznie, aby nie blokować interfejsu użytkownika. Mamy 2 opcje przed nami:
Korzystanie ASYNC czekają wyszukiwane To wymaga oznakowania wszystkich metod ASYNC od kliknięcia przycisku całą drogę do obsługi warstwy (klasa po stronie klienta, który sprawia, że połączenia HTTP do serwera) i dowolną metodę pomiędzy. Podejście to działa dobrze, inne niż kwestia propagowania asynchronicznie wszędzie
Zastosowanie awaiter i zwrotna W tym podejściu klient UI nazywa warstwie usług i przechodzi wywołania zwrotnego do warstwy usług, warstwa usługa owija połączenia HTTP do serwer w zadaniu i użyj GetAwaiter(). GetResult(), po zakończeniu wywołania http wywołuje wywołanie zwrotne przekazane przez klienta interfejsu użytkownika. W tym przypadku żadna metoda nie musi oznaczać asynchronizacji, ale nie jest do końca pewna co do użycia funkcji GetAwaiter()
Task.Run (async() => // oczekiwanie na połączenie http, wywołanie zwrotne) .GetAwaiter(). GetResult ();
Ja tylko próbuje dowiedzieć się, co jest lepsze podejście i jeśli są jakieś problemy z obu podejścia, które powinny być świadomy
Jestem prawie pewien, że drugie podejście może czasami prowadzić do martwych zamków. Wiem, ponieważ napotkałem coś podobnego podczas pracy z Windows Universal. – Felype
Istnieje również kwestia wyjątków. Wiem, że przy pełnej asynchronicznej implementacji na końcu pojawia się 'AggregateException', ale nie mam pojęcia, co dzieje się z wyjątkami w metodzie' GetAwaiter'. – Eris
@Eris Kiedy oczekujesz, że nie dostaniesz 'AggregateException'. Otrzymujesz wewnętrzny wyjątek. To samo dzieje się z 'GetResult'. – i3arnon