Метод проверки прокси в C # приводит к зависанию графического интерфейса при отключенном адаптере локальной сети (асинхронный / ожидающий) - PullRequest
0 голосов
/ 11 апреля 2019

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

Я заметил, что графический интерфейс пользователя зависнет, как только я отключу сетевой адаптер. Время ожидания в 2 секунды также игнорируется - почему?

Я приложил свой код (упрощенный пример, но проблему можно воспроизвести, отключив сетевой адаптер):

namespace HttpUtilities
{
    public static class HttpRestClient
    {
        public static async Task<HttpStatusCode> TestProxy()
        {
            string uniqueId = Guid.NewGuid().ToString();

            HttpClientHandler httpClientHandler = new HttpClientHandler
            {
                PreAuthenticate = true,
                Proxy = WebRequest.DefaultWebProxy,
                UseDefaultCredentials = true,
                Credentials = CredentialCache.DefaultNetworkCredentials
            };

            try
            {
                using (HttpClient client = new HttpClient(httpClientHandler) { Timeout = TimeSpan.FromSeconds(2) })
                {
                    HttpResponseMessage response = await client.GetAsync(new Uri("https://www.google.com"), new CancellationToken());

                    if (response != null)
                    {
                        return response.StatusCode;
                    }
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            return HttpStatusCode.BadRequest;
        }
    }
}

private async void button1_Click(object sender, EventArgs e)
{
    HttpStatusCode code = await HttpRestClient.TestProxy();
    System.Diagnostics.Debug.WriteLine(code);
}

Что мне здесь не хватает? Я пытался вызвать этот код в отдельной Задаче, но это привело к другим проблемам. Я подумал, что здесь достаточно ключевых слов async / await.

...