C# 第一次单击async按钮时,UI冻结5秒钟
当用户界面冻结5秒,第一次点击一个按钮时,可以吗?我的意思是,当我点击按钮从网站加载内容时,我不能在5秒钟内移动窗口 我的代码如下所示:C# 第一次单击async按钮时,UI冻结5秒钟,c#,wpf,asynchronous,async-await,task-parallel-library,C#,Wpf,Asynchronous,Async Await,Task Parallel Library,当用户界面冻结5秒,第一次点击一个按钮时,可以吗?我的意思是,当我点击按钮从网站加载内容时,我不能在5秒钟内移动窗口 我的代码如下所示: private async void Button_Click(object sender, RoutedEventArgs e) { var html = await GetHtmlAsync("http://msdn.microsoft.com"); MessageBox.Show(html.Substring(0
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);
}
private async void按钮\u单击(对象发送方,路由目标)
{
var html=await GetHtmlAsync(“http://msdn.microsoft.com");
Show(html.Substring(0,10));
}
公共异步任务GetHtmlAsync(字符串url)
{
var webClient=新的webClient();
返回wait-webClient.downloadstringtasksync(url);
}
但是,如果我第二次单击上面的按钮或单击其他async
按钮,则没有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);
}
private async void btnURLclick(对象发送方,RoutedEventArgs e)
{
秒表sw=新秒表();
sw.Start();
var html=await GetHtmlAsync(“http://msdn.microsoft.com");
Debug.WriteLine($“btn{sw.elapsedmillesons}”);
Show(html.Substring(0,10));
}
公共异步任务GetHtmlAsync(字符串url)
{
秒表sw=新秒表();
sw.Start();
var webClient=新的webClient();
Debug.WriteLine($“taskA{sw.elapsedmillesons}”);
返回wait-webClient.downloadstringtasksync(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);
}
公共异步任务GetHtmlAsync(字符串url)
{
等待任务。延迟(1)。配置等待(false);
var webClient=新的webClient();
返回Wait webClient.DownloadStringTaskAsync(url).ConfigureWait(false);
}
HttpClient是一个不错的选择,但让我们看看代码 正在为该应用程序提取代码。如果您实际收到的是
HttpWebRespone
,则此代码片段可能会指向您看到的问题
public override Stream GetResponseStream()
{
CheckDisposed();
return _httpResponseMessage.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
}
更准确一点。可以延迟结果,而不是冻结UI。如何确定它已冻结?尝试将
async
调用更改为var html=wait Task.Run(AsyncFoo)代码>?@Fabjan-这是一种可怕的暴力手段。也许这是需要的,但OP应该首先寻找其他选项。这里阻止您的不是异步机制,而是WebClient和/或您的网络层。您可以发布一个自我回答。。。我只是在猜测。也许有人会告诉我们为什么HttpClient做得更好。这不会告诉你什么部分是冻结的。OP已经确定这是downloadstringtaskancy()
调用。。。我们已经删除了新的WebClient()
,但无论如何这不太可能。@HenkHolterman我看不出这是在哪里建立的。得到一些数字不会有什么坏处。继续。然后最好使用Task.Yield
,或者直接运行Task.Run
@KevinGosse,您可以使用configurewait
和Task.Yield
?