async/await 致WPF卡死问题

  • async/await 致WPF卡死问题已关闭评论
  • 128 次浏览
  • A+
所属分类:.NET技术
摘要

问题代码: xmal:一个按钮+一个显示框 cs:点击按钮,显示结果Button_Click事件处理中获取异步方法getResult的结果, getResult只是简单等待1s后返回结果,却并没有如预期返回。

问题代码:

xmal:一个按钮+一个显示框

async/await 致WPF卡死问题

 

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处异步线程执行完之后,后面的任务仍交由主线程去处理(返回结果),而主线程在等待结果,造成死循环。

解决办法:

  1. 主线程异步等待结果(click事件也要改写成async)
    var t=await getResult();

  2. await任务执行完之后仍交于当前线程处理后续步骤(返回结果)

    await Task.Delay(1000).ConfigureAwait(false)

     

翻译

搜索

复制