Почему мой отладчик застревает в ожидании? - PullRequest
0 голосов
/ 05 февраля 2019

Я новичок в этом, поэтому, пожалуйста, потерпите меня.Я отлаживаюсь, и у меня возникла проблема со строкой:

var response = await client.GetAsync(uri);

Я отредактировал вопрос, чтобы он соответствовал примеру Minimal, Complete и Verifiable.

Я перехожу черезотладчик этого оператора, поэтому перейти к следующему утверждению, но по неизвестной мне причине отладчик кажется потерянным и не восстанавливается.

Каждый раз, когда я нажимаю на вызов await и перешагиваем, он простослучается каждый раз.Точка останова отладчика просто исчезает.

Ниже приведен весь код:

public class App : Application // superclass new in 1.3
{
    public App ()
    {
        MainPage = new PinPage { Title = "Pins", Icon = "marker.png" };
    }
}

public class PinPage : ContentPage
{
    private async Task FetchDataAsync()
    {
        HttpClient client = new HttpClient();
        string resultUrl = "http://myuser.gtempurl.com/Service1.svc/GetLocations";
        var uri = new Uri(string.Format(resultUrl, string.Empty));
        var response = await client.GetAsync(uri);
        if (response.IsSuccessStatusCode)
        {
            string content = await response.Content.ReadAsStringAsync();
            var obj = JsonConvert.DeserializeObject(content);
        }

    }
    public PinPage ()
    {
        FetchDataAsync().GetAwaiter().GetResult();
    }
}

Служба WCF не является проблемой.Он публикуется на общедоступном сервере, поэтому всегда доступен.Я вызываю его из браузера, и он возвращает ожидаемую строку.

Я использую VS2017, и он отлаживается в эмуляторе Android.

Вот снимок экрана, когда точка останова достигаетвыписка :

enter image description here

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Использовать Почтальон (https://www.getpostman.com/). Сначала проверьте URL. Если почтальон может получить данные, значит, что-то не так с вашим клиентским приложением. В противном случае веб-интерфейс не работает.

0 голосов
/ 05 февраля 2019

не перемещается на следующую строку.Никакая другая строка кода не подсвечивается желтым, нет тайм-аута, ничего.

Звучит как тупик.Поскольку это приложение пользовательского интерфейса, проверьте в стеке вызовов все блокирующие вызовы, такие как Wait(), Result или GetAwaiter().GetResult().Они могут тупиковая ситуация, если вызывается из потока пользовательского интерфейса .

Правильное решение состоит в том, чтобы изменить их на await;другими словами, используйте async полностью .

0 голосов
/ 05 февраля 2019

Оператор Await работает таким образом, когда вы ожидаете задачу, выполнение кода выпрыгнет из текущей функции и передаст управление ее вызывающей стороне.Затем, когда ожидаемая задача завершается, она возвращается к выполнению кода после оператора await.

В вашем случае: оператор await приостанавливает выполнение до завершения работы метода client.GetAsync (uri) ",Тем временем управление возвращается вызывающей стороне FetchDataAsync.Когда задача завершает выполнение, выражение await преобразуется в ответ.

Если вы перейдете после того, как await оценит ответ, отладчик перейдет к следующему шагу, если await не вернул выделение отладчика.потерян.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...