async/await 致WPF卡死问题

种地  金牌会员 | 2023-10-2 01:44:15 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 921|帖子 921|积分 2763

问题代码:
xmal:一个按钮+一个显示框

 
  1. 1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button>
  2. 2 <TextBox x:Name="display" Width="300" Height="300"></TextBox>
复制代码
cs:点击按钮,显示结果
  1.         async Task<int> getResult()
  2.         {
  3.             await Task.Delay(1000);
  4.             return 10;            
  5.         }
  6.         private  void Button_Click(object sender, RoutedEventArgs e)
  7.         {
  8.             display.Text = "Starting to get Result..........\n";
  9.             var t= getResult().Result;
  10.             display.AppendText($"The result is:{t}\n");
  11.         }
复制代码
Button_Click事件处理中获取异步方法getResult的结果, getResult只是简单等待1s后返回结果,却并没有如预期返回。
分析:
getResult中遇到await后,主线程返回等待结果,await处异步线程执行完之后,后面的任务仍交由主线程去处理(返回结果),而主线程在等待结果,造成死循环。
解决办法:

  • 主线程异步等待结果(click事件也要改写成async)
    1. var t=await getResult();
    复制代码
  • await任务执行完之后仍交于当前线程处理后续步骤(返回结果)
    1. await Task.Delay(1000).ConfigureAwait(false)
    复制代码
     
翻译
搜索
复制

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表