使用长时间运行的任务时,界面挂起
本文关键字:界面 挂起 任务 长时间 运行 | 更新日期: 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);
}
}