Call to Azure web api из приложения для Android просто висит навсегда, ожидая ответа

c# android visual-studio azure samsung-mobile

330 просмотра

2 ответа

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

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

Я использую Visual Studio 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;
            }
        }
    }

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

Автор: Richard77 Источник Размещён: 08.11.2019 11:19

Ответы (2)


1 плюс

Решение

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

Автор: Xiaoguo Ge Размещён: 20.08.2016 01:32

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он не привязан к пользовательскому интерфейсу, или вам может потребоваться доступ к потоку пользовательского интерфейса для его обновления.

Автор: Swagata Prateek Размещён: 20.08.2016 12:58
Вопросы из категории :
32x32