使用长时间运行的任务时,界面挂起

本文关键字:界面 挂起 任务 长时间 运行 | 更新日期: 2023-09-27 18:12:31

我有一个WPF应用程序(c# 6.0, .NET 6.1, Visual Studio 2015, x64),当我启动以下任务时,它会冻结界面:

private async void ComputeButton_Click(object sender, RoutedEventArgs e) {
  await Scanner();
  DrawButtons();
}
private static async Task Scanner() {
  try {
    BigBox.DoScan();
    await Task.CompletedTask;
  } catch (Exception ex) {
    SMErrorLog.WriteLog("Scanner error: ", ex);
  }
}

我的应用程序由几个选项卡组成。上面的代码位于其中一个选项卡中。如果我单击"Compute"按钮,计算将继续(持续几分钟),但是在计算进行时,我不能选择任何其他选项卡来执行其他操作。我假设上面的代码是异步的,我不明白为什么当DoScan运行时应用程序会冻结。

如有任何帮助或建议,我将不胜感激。 查尔斯

使用长时间运行的任务时,界面挂起

为了让你的UI响应异步,你需要执行BigBox.DoScan()然后使用await关键字等待它完成,因为这些发生在另一个任务上,所以UI不会冻结:

 private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        await Scanner();
    }
  private static async Task Scanner()
    {
        try
        {
            await Task.Run(() =>
            {
                 BigBox.DoScan();
            });
        }
        catch (Exception ex)
        {
           SMErrorLog.WriteLog("Scanner error: ", ex);
        }
    }