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();
}
第一次点击按钮时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();
}