SendAsync блокирует поток пользовательского интерфейса - PullRequest
1 голос
/ 07 мая 2019

Попытка преобразовать часть моей программы в асинхронный вызов HTTP-клиента. Взял часть кода (которая ниже) для тестирования. В основном асинхронная кнопка с неблокирующими (должно быть, насколько мне известно) SendAsync (). Это не должно блокировать поток пользовательского интерфейса, я прав? Это все еще блокирует это по причине, которую я не могу видеть в настоящее время.

Я провел последние 2 дня, пытаясь понять, что не так. Я реализовал неблокирующие функции записи файлов и записи электронной почты, и они работают правильно.

Может кто-нибудь указать, что я делаю не так, пожалуйста?

private async void button2_Click(object sender, EventArgs e)
    {
    NetworkCredential differentCredToPass = new NetworkCredential("user", "*****", "domain");
    WebProxy wcProxy = new WebProxy("1.1.1.1", 8080);
    wcProxy.UseDefaultCredentials = false;
    wcProxy.Credentials = differentCredToPass;
    var httpHandler = new HttpClientHandler();
    httpHandler.UseProxy = true;
    httpHandler.UseDefaultCredentials = false;
    httpHandler.Proxy = wcProxy;
    using(HttpClient httpClient = new HttpClient(httpHandler) )
        {
        try
            {
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://cisco.Com");
            HttpResponseMessage response = await httpClient.SendAsync(request);
            textBox1.AppendText(response.StatusCode.ToString() + Environment.NewLine);
            }
        catch (Exception ex)
            {
            textBox1.AppendText(ex.Message.ToString() + Environment.NewLine);
            throw;
            }
        }
    }

1 Ответ

2 голосов
/ 08 мая 2019

неблокирующая (насколько мне известно) SendAsync ()

Ну да и нет. К сожалению, по историческим причинам SendAsync не является чисто асинхронным. В частности, синхронно выполняется поиск DNS и разрешение прокси. Итак, чтобы сделать это полностью неблокирующим, вам нужно заключить этот вызов в Task.Run:

HttpResponseMessage response = await Task.Run(() => httpClient.SendAsync(request));
...