【问题标题】:Interface hangs when using a long running Task [duplicate]使用长时间运行的任务时界面挂起[重复]
【发布时间】:2016-10-12 01:53:28
【问题描述】:

我有一个 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 运行时冻结。

任何帮助或建议将不胜感激。

查尔斯

【问题讨论】:

标签: c# wpf task


【解决方案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);
        }
    }

【讨论】:

  • 谢谢罗。它现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多