代码之家  ›  专栏  ›  技术社区  ›  StepUp

第一次单击异步按钮时,用户界面冻结5秒

  •  2
  • StepUp  · 技术社区  · 6 年前

    当用户界面被冻结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 回复  |  直到 6 年前
        1
  •  1
  •   JSteward    6 年前

    这个 HttpClient 是一条路,但让我们看看代码。

    提取的代码 corefx source . 如果你真的得到了 HttpWebRespone 这个片段可能会指向你所看到的问题。

    public override Stream GetResponseStream()
    {
        CheckDisposed();
        return _httpResponseMessage.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
    }
    
        2
  •  1
  •   paparazzo    6 年前

    可能有一些缓存。每次呼叫尝试另一个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);
    }
    
        3
  •  -1
  •   Henk Holterman    6 年前

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

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