是否可以在按钮单击期间等待异步任务?

我的应用程序中有一个刷新按钮,它使用一些异步方法来更新显示的项目列表。 问题是我不能为按钮单击的事件处理程序提供返回类型的任务,所以我留下了一个异步void方法。 因此,用户可以点击刷新按钮,然后在重新填充列表时选择项目,这将导致错误。

处理按钮点击的代码的开头:

private async void Button_Click_1(object sender, RoutedEventArgs e) { await ViewModel.CreateMessageCommand(); 

那么无论如何要正确等待这项任务完成?

由于控件的事件处理程序通常返回void ,因此您需要以不同的方式处理它。 在您的场景中,这通常意味着您需要在加载内容时禁用全部或部分UI,即:

 private async void Button_Click_1(object sender, RoutedEventArgs e) { // Make the "list" disabled, so the user can't "select an item" and cause an error, etc DisableUI(); try { // Run your operation asynchronously await ViewModel.CreateMessageCommand(); } finally { EnableUI(); // Re-enable everything after the above completes } } 

您应该只是禁用用户在操作开始时不应与之交互的所有UI控件,然后在最后启用它们。

一种方法是从WPF Toolkit中将View包装在BusyIndi​​cator中

您将在viewmodel上提供bool属性,并在开始和结束时切换值。

它将UI元素置于所有其他控件上方,阻止用户交互,但提供动画忙碌消息,可以更新以表达您想要的任何内容。