2016-08-20 7 views
2

Я опубликовал в Azure очень простой код api.net asp.net, который поставляется с шаблоном. Когда я пытаюсь выполнить действие GET по умолчанию, я получаю ответ JSON ["value1","value2"]Звоните на Azure web api из приложения для Android просто вешает в ожидании ответа

Когда я пытаюсь сделать тот же вызов из моего проекта xamarin-android, выполнение просто зависает вечно, ожидая ответа (см. Код ниже).

Я использую визуальную студию 2015. Я подключил свой телефон для отладки.

 button.Click += onButtonClick; 
    } 

    private void onButtonClick(object sender, EventArgs e) 
    { 
     GetValuesSync().Wait(); 
    } 

    private async Task GetValuesSync() 
    { 
     string ResponseJsonString = null; 

     string url = 
      "http://myWebapp.azurewebsites.net/api/values"; 

     using (var httpClient = new HttpClient()) 
     { 
      try 
      { 
       Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url); 
       HttpResponseMessage response = await getResponse; //Execution hangs here forever ... 
       ResponseJsonString = await response.Content.ReadAsStringAsync(); 
       values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString); 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 
     } 
    } 

Спасибо за помощь

+1

У вас есть тупик здесь 'GetValuesSync() .Wait();'. –

+0

@ Richard77: Я рекомендую прочитать мою статью [MSDN о лучших методах асинхронизации] (https://msdn.microsoft.com/en-us/magazine/jj991977.aspx) и мое сообщение в блоге [Не блокировать код Async] (http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html). –

ответ

1

В дополнение к ответу выше, как наилучшая практика, попробуйте всегда указать, в каком потоке необходимо вызвать продолжение после ожидания. В вашем случае явно вызов ConfigureAwait (false) также должен решить проблему взаимоблокировки.

+0

Действительно, я забыл добавить это. Благодаря! –

+0

Кажется, что этот вопрос больше связан с моим отсутствием знаний о асинхронном программировании, чем в том, как работает xamarin android. У меня много догоняющих покупок. Невозможно сказать разницу между ожиданием впереди и вызовом «Подождите» на самом объекте. – Richard77

3

Это всегда лучше оставить асинхра асинхронного рабочего процесса. Сильно сделать его синхронизацией, по сути, заблокирует ваш поток пользовательского интерфейса, и приложение потеряет свою отзывчивость.

Что делать, если вы пытаетесь что-то вроде этого:

private async void onButtonClick(object sender, EventArgs e) 
{ 
    await GetValuesAsync(); 
} 

private async Task GetValuesAsync() 
{ 
    string ResponseJsonString = null; 

    string url = 
     "http://myWebapp.azurewebsites.net/api/values"; 

    using (var httpClient = new HttpClient()) 
    { 
     try 
     { 
      Task<HttpResponseMessage> getResponse = httpClient.GetAsync(url); 
      HttpResponseMessage response = await getResponse; //Execution hangs here forever ... 
      ResponseJsonString = await response.Content.ReadAsStringAsync(); 
      values = JsonConvert.DeserializeObject<string[]>(ResponseJsonString); 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 
} 

values Я надеюсь, не привязан к UI или вы могли бы получить доступ потока пользовательского интерфейса, чтобы обновить его.