Пользовательский интерфейс останавливается на 5 секунд при первом нажатии асинхронной кнопки - PullRequest
0 голосов
/ 10 июня 2018

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

Мой код выглядит так:

private async void Button_Click(object sender, RoutedEventArgs e)
{            
    var html = await GetHtmlAsync("http://msdn.microsoft.com"); 
    MessageBox.Show(html.Substring(0, 10));
}


public async Task<string> GetHtmlAsync(string url)
{
    var webClient = new WebClient();
    return await webClient.DownloadStringTaskAsync(url);
}

Однако, если я нажимаювыше, во второй раз или нажмите другие кнопки async, тогда пользовательский интерфейс не зависает.

Так ли это нормально, когда пользовательский интерфейс замораживается на 5 секунд, когда кнопка нажимается в первый раз?

Ответы [ 3 ]

0 голосов
/ 10 июня 2018

Вероятно, это связано с некоторой инициализацией связи.Попробуйте это:

public async Task<string> GetHtmlAsync(string url)
{
    await Task.Delay(1).ConfigureAwait(false);
    var webClient = new WebClient();
    return await webClient.DownloadStringTaskAsync(url).ConfigureAwait(false);
}
0 голосов
/ 11 июня 2018

HttpClient - это путь, но давайте посмотрим на код.

Получение кода для corefx source .Если вы на самом деле получаете HttpWebRespone, этот фрагмент может указывать на проблему, которую вы видите.

public override Stream GetResponseStream()
{
    CheckDisposed();
    return _httpResponseMessage.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
}
0 голосов
/ 10 июня 2018

Там может быть некоторое кеширование.Попробуйте другой URL каждый звонок.Но с ожиданием это не должно блокировать.

Я проверил, и у меня нет лагов.Я бы начал новый клиент.Происходит что-то странное.

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

private async void btnURLclick(object sender, RoutedEventArgs e)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    var html = await GetHtmlAsync("http://msdn.microsoft.com");
    Debug.WriteLine($"btn {sw.ElapsedMilliseconds}");
    MessageBox.Show(html.Substring(0, 10));

}
public async Task<string> GetHtmlAsync(string url)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    var webClient = new WebClient();
    Debug.WriteLine($"taskA {sw.ElapsedMilliseconds}");
    return await webClient.DownloadStringTaskAsync(url);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...