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

C# 是否可以在单击按钮期间等待异步任务?,c#,microsoft-metro,windows-store-apps,async-await,C#,Microsoft Metro,Windows Store Apps,Async Await,我的应用程序中有一个刷新按钮,它使用一些异步方法来更新显示的项目列表。问题是,我不能为按钮单击的事件处理程序返回任务类型,因此我只能使用异步void方法。因此,用户可以点击刷新按钮,然后在重新填充列表时选择一个项目,这将导致错误 处理按钮单击的代码的开头: private async void Button_Click_1(object sender, RoutedEventArgs e) { await ViewModel.CreateMessageComm

我的应用程序中有一个刷新按钮,它使用一些异步方法来更新显示的项目列表。问题是,我不能为按钮单击的事件处理程序返回任务类型,因此我只能使用异步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控件,然后在操作结束时启用它们。

一种方法是从

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


它在所有其他控件之上设置了一个UI元素,阻止用户交互,但提供了一条动画繁忙消息,可以根据需要进行更新。

我不明白为什么不应该这样做。除非他们限制您可以使用哪些第三方库。您不能在Windows应用商店应用程序中使用WPF控件。不同的平台,尽管仍然是Xaml。您需要一个第三方繁忙指示器端口(或编写您自己的)@ReedCopsey,因为它是开源的,您可以下载源代码并重新编译以获得正确的平台。或者只接受相关的BusyIndicator控件。@ywm不幸的是,从WPF移动到Windows应用商店通常远不止是重新编译。Windows应用商店API的功能远不如WPF丰富,因此根据控件中使用的内容,可能很难实现。Silverlight工具包的版本可能是一个简单得多的端口: