2016-06-29 4 views
4

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

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; 
} 
+0

Вы используете локальный хост или локальный адрес? –

+0

@AthulHarikumar веб-служба размещена на бесплатном экземпляре Azure Web Apps –

ответ

8

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

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

  1. Не вызывая GetInformationAsync в синхронизации пути
  2. Postfixing ваших звонков в асинхронном 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); 
+0

Вызов GetInformationAsync с использованием async-образа, без изменений в самом GetInformationAsync. Благодаря! –

+1

ConfigureAwait (false) Работает для меня. Благодаря! –

Смежные вопросы