我有一个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运行时冻结。
非常感谢任何帮助或建议。
查尔斯
答案 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);
}
}