C# 第一次单击async按钮时,UI冻结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

当用户界面冻结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);
}
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