问题代码:
xmal:一个按钮+一个显示框
1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button> 2 <TextBox x:Name="display" Width="300" Height="300"></TextBox>
cs:点击按钮,显示结果
async Task<int> getResult() { await Task.Delay(1000); return 10; } private void Button_Click(object sender, RoutedEventArgs e) { display.Text = "Starting to get Result..........\n"; var t= getResult().Result; display.AppendText($"The result is:{t}\n"); }
Button_Click事件处理中获取异步方法getResult的结果, getResult只是简单等待1s后返回结果,却并没有如预期返回。
分析:
getResult中遇到await后,主线程返回等待结果,await处异步线程执行完之后,后面的任务仍交由主线程去处理(返回结果),而主线程在等待结果,造成死循环。
解决办法:
- 主线程异步等待结果(click事件也要改写成async)
var t=await getResult();
-
await任务执行完之后仍交于当前线程处理后续步骤(返回结果)
await Task.Delay(1000).ConfigureAwait(false)
翻译
搜索文章来源:https://www.toymoban.com/news/detail-712114.html
复制文章来源地址https://www.toymoban.com/news/detail-712114.html
到了这里,关于async/await 致WPF卡死问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!