【问题标题】:Is it possible to await async tasks during a button click?是否可以在单击按钮期间等待异步任务?
【发布时间】:2013-07-21 11:50:07
【问题描述】:

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

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

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


        await ViewModel.CreateMessageCommand();

那么,是否有适当的方式等待此任务完成?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        一种方法是将视图包装在来自 WPF Toolkit 的 BusyIndi​​cator 中

        您将在视图模型上提供一个 bool 属性并在开始和结束时切换值。

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

        【讨论】:

        • 我不明白为什么不应该这样做。除非他们限制您可以使用的第 3 部分库。
        • 您不能在 Windows 应用商店应用中使用 WPF 控件。不同的平台,但仍然是 Xaml。您需要一个第 3 方忙碌指示端口(或自己编写)
        • @ReedCopsey 因为它是开源的,你可以下载源代码并重新编译到正确的平台。或者只取相关的 BusyIndi​​cator Control。
        • @ywm 不幸的是,从 WPF 迁移到 Windows 应用商店通常不仅仅是重新编译。 Windows 应用商店 API 的功能远不如 WPF 丰富,因此根据控件中使用的内容,这可能会很困难。 Silverlight 工具包中的版本可能是一个更简单的端口:silverlight.codeplex.com/SourceControl/latest#Release/…
        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 2014-09-06
        • 2021-11-07
        • 1970-01-01
        • 2014-03-18
        • 2012-12-18
        • 2019-07-22
        • 2022-01-22
        相关资源
        最近更新 更多