UI第一次点击异步按钮时冻结5秒

UI is freezed for 5 seconds when async button is clicked at the first time

第一次点击按钮时UI冻结5秒可以吗?我的意思是当我点击按钮从网站加载内容时,我无法移动 window 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按钮,那么就没有UI冻结。

第一次点击按钮时UI冻结5秒可以吗?

可能有一些缓存。每次通话再试一次 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);
}

这可能是由于一些通信初始化。试试这个:

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

HttpClient 是正确的方法,但让我们看一下代码。

正在提取 corefx source 的代码。如果您确实收到 HttpWebRespone 此代码段可能会指出您遇到的问题。

public override Stream GetResponseStream()
{
    CheckDisposed();
    return _httpResponseMessage.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
}