Cześć, wywołuję sobie asynchronicznie metody i coś mi się zakleszczyło. Póki co, nie ogarnąłem dlaczego tak się dzieje.
Problem dotyczy projektu WinForms.
Wszystko zaczyna się od metody Main.
Mam tam następujące wywołanie:
bool res = Task.Run(() => contr.RegisterPremiseAllInOne()).Result;
Wywołuję po prostu metodę asynchroniczną RegisterPremiseAllInOne w nowym Tasku.
Co się dzieje dalej. Metoda RegisterPremiseAllInOne działa mniej więcej tak (uproszczony model):
public async Task<bool> RegisterPremiseAllInOne()
{
AppUser loggedAppUser = await appUserContr.GetLoggedAppUser(); // <-- tu wszystko jest ok
if(loggedAppUser == null)
return false;
var premises = await GetPremisesForLoggedUser(); //tu na końcu jest zakleszczenie
}
I teraz pokażę co wywołują poszczególne metody (wszystko rozbija się o zapytania RESTowe WebAPI):
GetLoggedAppUser -> await API.Users.GetLoggedAppUser() -> await ClientHelper.GetObjectFromRequest<AppUser>("AppUsers/logged") -> await SendAsyncRequest() -> await HttpClient.SendAsync()
To powinno być w miarę czytelne.
I tu jest wszystko OK. Co ciekawe, metoda GetPremisesForLoggedUser jest częściowo zbieżna z tą i wygląda tak:
GetPremisesForLoggedUser -> await API.Premises.GetForLoggedUser() -> await ClientHelper.GetListFromRequest<Premise>("premises/logged") -> await SendAsyncRequest() -> await HttpClient.SendAsync()
Jak widać droga jest prosta. Wywołanie metody z API, które na końcu po prostu posyła requesta.
Wszystko wiesza się podczas wywołania SendAsync z HttpClient. Nie mam zielonego pojęcia dlaczego. W końcu pierwsza ścieżka (GetLoggedAppUser) działa ok.
Po stronie serwera też wszystko jest OK. Serwer zwraca poprawną odpowiedź. A klient jak wisiał, tak wisi.
Wg mnie to wszystko powinno zadziałać. Nie mieszam przecież kodu synchronicznego z asynchronicznym. Wszystkie te metody zwracają Task<T> i są oznaczone jako async. Więc gdzie może leżeć problem? A może chcecie zobaczyć screeny z okien debug Parallel Stack / Tasks?