HttpClient.SendAsync НАРУЖНО сбой или блокировка? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть настоящая загадка, но сначала немного предыстории.

Я разрабатываю (изучая C # и .Net) приложение WPF, которое

  • использует HttpClient для подключения кчасть сетевого оборудования
  • загружает файл журнала в формате .csv (после входа в систему)
  • массирует записи журнала и представляет их в GridView

.я научился писать каждый компонент (login, get_log, process_log и т. д.) по отдельности как консольные приложения, а затем объединять их вместе в рамках WPF.

Как вы можете себе представить, я смогзаставить все отдельные функции работать самостоятельно;но когда я собрал все части вместе, кажется, что приложение не может преодолеть начальное соединение - по сути, GET http://10.0.0.1/login.html?/main.html. Я прошел через WPF-версию и обнаружил, что она вошла в вызов client.SendAsync(), но не пришлаобратно.(Тайм-аут экземпляра HttpClient установлен по умолчанию на 100 секунд, и я ждал НАМНОГО дольше, чем это.)

Пока программа «зависает», главное окно приложения полностью не отвечает: ни один из способов свертывания, разворачивания или закрытияконтролирует работу.Я даже не могу перетащить окно, хотя могу щелкнуть другие окна и снова щелкнуть по нему, чтобы восстановить фокус.

Когда я наблюдаю сетевой трафик с помощью Wireshark, я вижу, что мое приложение отправляет запрос GETи удаленное устройство отвечает 200 OK и соответствующим содержимым HTML, но ничего больше после этого.

Я дважды и трижды проверил код между версией WPF и версией консоли (для этого конкретного раздела) и они идентичны.

Итак, мои вопросы:

  1. Кто-нибудь видел что-нибудь подобное раньше?
  2. Любые предложения о том, как я могу поступить с фигурамичто происходит?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Кто-нибудь видел что-то подобное раньше?

Да

Есть какие-нибудь предложения о том, как я могу выяснить, что происходит?

Никогда не используйте .Wait() или .Result при асинхронном методе.Вместо этого используйте await.В консольном приложении это не может быть проблемой, поскольку оно не имеет контекста синхронизации.Однако в приложении WPF вы почти гарантированно попадете в тупик, если он будет запущен в потоке пользовательского интерфейса.

Если вас интересует более подробная информация, Стивен Клири получил отличное объяснение в своем блоге

0 голосов
/ 04 апреля 2019

Асинхронное / ожидание решить проблему блокировки

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        using (var httpClient = new HttpClient())
        {
            httpClient.BaseAddress = new Uri("http://localhost");
            HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Post, "users");
            httpRequest.Content = new StringContent("{name:'admin'}");
            var httpResponse = await httpClient.SendAsync(httpRequest);
            //process http response
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...