HttpClient.GetAsync никогда не возвращается на Xamarin.Android

Я работаю над приложением Android, которое поддерживается приложением ASP.NET Core, размещенным в Azure. Я использую проект с общей библиотекой для тестирования базовых компонентов проекта консольного приложения перед выполнением функциональных возможностей для проекта Xamarin.Forms (только для Android).
Следующий кусок кода запускаетсяпосле вход в веб-сервис, гдеClient этоHttpClient:

public static async Task<MyClass> GetInformationAsync(string accountId)
{
    HttpResponseMessage response = await Client.GetAsync(UriData + "/" + accountId);
    response.EnsureSuccessStatusCode();
    string responseContent = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<MyClass>(responseContent);
}

В том же компьютере / сети код завершается менее чем за секунду в Консольном приложении, однако он никогда не завершается (даже подождал минуту) вXamarin.Forms.Android проект.
Я нахожу это странным, так как клиент Android может успешно войти в веб-сервис, используяPostAsync.

Однако есть разница в том, как клиент Android и консольный клиент вызываютGetInformationAsync.

Пока консольный клиент вызывает его асинхронно:

 private static async void TestDataDownload()
 {
      ...
      var data = await WebApiClient.GetInformationAsync(myId);
 }

Клиент Android вызывает это синхронно

 public void MainPage()
 {
      ...
      var data = WebApiClient.GetInformationAsync(myId).Result;
 }
 Athul Harikumar29 июн. 2016 г., 06:11
Вы используете локальный хост или локальный IP-адрес?
 SO used to be good29 июн. 2016 г., 13:12
@AthulHarikumar веб-служба размещена на бесплатном экземпляре веб-приложений Azure.

Ответы на вопрос(1)

Решение Вопроса

вы в каком-то тупике. Возможно, вы захотите включить код, где вы на самом делеGetInformationAsync, как это, вероятно, где источник проблемы.

Вы можете, вероятно, решить вашу проблему:

Не звонитGetInformationAsync синхронноПостфиксирование ваших асинхронных звонков вGetInformationAsync сConfigureAwait(false) не переключать контекст при каждом вызове метода.

Так что вашиGetInformationAsync метод будет выглядеть так:

public static async Task<MyClass> GetInformationAsync(string accountId)
{
    var response = await Client.GetAsync(UriData + "/" + accountId).ConfigureAwait(false);
    response.EnsureSuccessStatusCode();
    var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    return JsonConvert.DeserializeObject<MyClass>(responseContent);
}

Тогда, если вы вызываете это где-то, вам нужно, чтобы он вернулся в том же контексте, т.е. если вам нужно обновить интерфейс:

var myClass = await GetInformationAsync(accountId);
// update UI here...

В противном случае, если выне нужно вернуться в том же контексте:

var myClass = await GetInformationAsync(accountId).ConfigureAwait(false);
 SO used to be good30 июн. 2016 г., 02:24
Вызов GetInformationAsync асинхронным способом работал без изменений самого GetInformationAsync. Спасибо!
 Leonardo Neninger29 июн. 2017 г., 15:07
ConfigureAwait (false) работает для меня. Спасибо!

Ваш ответ на вопрос