使用长时间运行的任务

时间:2016-10-11 17:23:16

标签: c# wpf task

我有一个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);
  }
}

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

非常感谢任何帮助或建议。

查尔斯

1 个答案:

答案 0 :(得分:1)

为了使您的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);
        }
    }