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

时间:2013-07-22 16:28:21

标签: c# microsoft-metro windows-store-apps async-await

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

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

    private async void Button_Click_1(object sender, RoutedEventArgs e)
    {


        await ViewModel.CreateMessageCommand();

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

3 个答案:

答案 0 :(得分:21)

由于控件的事件处理程序通常返回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
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

一种方法是从WPF Toolkit

中包装BusyIndi​​cator中的View

您可以在viewmodel上提供bool属性,并在开头和结尾切换值。

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