首页 > 解决方案 > 第一次单击异步按钮时,UI 冻结 5 秒

问题描述

当第一次单击按钮时,UI 冻结 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按钮,则不会出现 UI 冻结。

那么当 UI 冻结 5 秒时,第一次单击按钮时可以吗?

标签: c#wpfasynchronousasync-awaittask-parallel-library

解决方案


可能有一些缓存。每次调用都尝试另一个 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);
}

推荐阅读