Я называю асинхронные методы и что-то тупиковое.Теперь я понятия не имею, почему это происходит.Я не думаю, что это стандартная тупиковая ситуация, потому что я вызываю Task.Result в методе Main, а не в потоке пользовательского интерфейса.Более того, я также попытался использовать асинхронную Main без каких-либо вызовов Task.Но результат тот же.
Проблема с проектом WinForms.Все начинается в методе Main:
bool res = Task.Run(() => contr.RegisterPremiseAllInOne()).Result;
Это реализованный вызов асинхронного метода RegisterPremiseAllInOne в новой задаче.
Что происходит дальше ... RegisterPremiseAllInOne работает примерно так (упрощенная модель):
public async Task<bool> RegisterPremiseAllInOne()
{
AppUser loggedAppUser = await appUserContr.GetLoggedAppUser(); // <-- everything works fine here
if(loggedAppUser == null)
return false;
var premises = await GetPremisesForLoggedUser(); //at the end there is a deadlock
}
Теперь я покажу вам, какие вызовы выполняет каждый метод (все заканчивается запросами остальных в WebApi):
GetLoggedAppUser ->
await API.Users.GetLoggedAppUser() ->
await ClientHelper.GetObjectFromRequest<Appuser>("AppUsers/logged") ->
await SendAsyncRequest() ->
await HttpClient.SendAsync()
Надеюсь, это вполне читабельно.
Этот путь работает хорошо.Что интересно, GetPremisesForLoggedUser
частично сходится с GetLoggedAppUser
и выглядит так:
GetPremisesForLoggedUser ->
await API.Premises.GetForLoggedUser() ->
await ClientHelper.GetListFromRequest<premise>("premises/logged") ->
await SendAsyncRequest() ->
await HttpClient.SendAsync()
Как видите, есть прямой путь.Позвоните в API и, в конечном итоге, отправьте http-запрос.
Deadlock находится в пределах SendAsync
с HttpClient
.Я понятия не имею, почему.И все же первый путь работает нормально.
На стороне сервера все тоже хорошо.Сервер возвращает успешный ответ.Но клиент зависает.
Я думаю, что это должно работать.Я не смешиваю синхронно с асинхронным кодом.Все методы возвращают Task<T>
и помечаются как асинхронные.
Может быть, кто-то знает, где может существовать проблема?Может быть, вы захотите увидеть некоторые скриншоты из окон отладки: Parallel Stack / Tasks?