ogladalem kiedys jakiegos goscia z Microsoftu, ktory mowil, ze jezeli juz nie da się zrobić asynca od góry to dołu, to zamiast Task.Result, powinno się
Task.GetAwaiter().GetResult()
Co o tym myślicie?
I tak, i nie. GetAwaiter w ogóle nie powinno być używane w kodzie użytkownika, bo jest to wystawione na potrzeby kompilatora i bebechów pod spodem, ale faktem jest, że inaczej to obsługuje wyjątki (troszkę lepiej). Ja bym jednak poszedł w Result.
Oba rozwiązania są niepoprawne, bo oba z pewnym jakimś prawdopodobieństwem spowodują dead-locka.
Znowu, tak i nie. Ryzyko zakleszczenia jest, oczywiście zależy od reszty kodu, ale większym problemem jest blokowanie wątku systemu operacyjnego. O ile zakleszczenia da się uniknąć (albo obejść), o tyle blokady wątku już nie, a dokładniej, to ominięcie blokady wymaga trochę czarowania generatorami lub fiberami i w 99% przypadków nie ma sensu tego robić.
Hmm, np. w ASP.NET Core imho to nigdy nie spowoduje deadlocka, więc to nie jest tak, że raz zadziała, a raz nie.
Nie wiem jak wygląda SynchronizationContext w Xamarinie.
Tak i nie. Blokujesz wątek, więc zawsze możesz mieć zakleszczenie, ale musiałbyś explicite próbować wrzucić jakiś kod do wykonania na zablokowanym wątku, bo kontekstu synchronizacji nie ma, a tego raczej nikt nie robi, więc z tej perspektywy nie będzie zakleszczenia. Xamarin, Blazor, WPF, WinForms, WinRT mają jednowątkowe konteksty, więc tam ryzyko zakleszczenia jest wyższe.