【问题标题】:Open a custom busy indicator while a main window is busy or doing some task在主窗口忙碌或执行某些任务时打开自定义忙碌指示器
【发布时间】:2017-12-03 08:31:56
【问题描述】:

我的应用程序基于 WPF。

任务是我需要在主窗口中工作时显示一个自定义忙碌指示器(因为应用程序 UI 将被冻结直到它完成任务)。所以我特别想要的是如下

// Code in main window
CustomBusyIndicator.ShowDialog();
//....
//..code that takes time
//....
CustomBusyIndicator.Close();

所以我必须实现一个窗口,该窗口必须灵活地调用我的主应用程序中的任何位置来指示忙碌。

这里要注意两点, 1. 当我显示 CustomBusyIndi​​cator 时,主窗口应该在后台运行它的任务 2.当我显示CustomBusyIndi​​cator时,CustomBusyIndi​​cator应该总是在主窗口的顶部,用户不能使用主窗口,如果他使用Start + tab或其他东西切换到其他应用程序,当他切换回我的应用程序时,CustomBusyIndi​​cator 应该在顶部(如果它没有关闭)。

任务完成后,我应该可以调用 close() 方法从主窗口关闭 CustomBusyIndi​​cator,如代码所示。

【问题讨论】:

    标签: c# .net wpf xaml mvvm


    【解决方案1】:

    容易解决

    public async void Button1_Click(Object sender, RoutedEventArgs e)
    {
        // get a task for the dialog, but do not await here its completion
        var dialogTask = CustomBusyIndicator.ShowDialogAsync();
        // await the completion of the lengthy operation
        await SomeLengthOperationAsync();
        // close the dialog
        CustomBusyIndicator.Close();
        // now await the completion of the dialog task
        await dialogTask;
    }
    

    扩展名是

    public static class WindowExtensions
    {
        public static async Task<bool?> ShowDialogAsync( this Window window )
        {
            await Task.Yield();
            return window.ShowDialog();
        }
    }
    

    【讨论】:

    • 不错的解决方案,但如果 OP 不知道异步等待,我不会建议他使用它。一个简单的编程规则。不要使用你不理解的东西。我绝不是对 Rufo 的解决方案持否定态度,这实际上并不是一个比我更好的解决方案和更现代的解决方案。我只是凭直觉考虑OP的经验,这个问题说明了一切。我认为他对线程了解不多。
    【解决方案2】:

    如果您不知道如何使用异步等待,只需将长时间运行的逻辑移动到后台工作程序中即可。有几个选项可以使后台工作程序与主 GUI 线程进行通信而不会出现问题。 根据您的问题和您的经验水平,我认为您对异步等待已经过头了。但是Rufo的解决方案也很好。

    Google 是你的朋友,有很多关于使用 backgroundworker 和 async await 的信息。完全掌握异步等待的潜力只需要更长的时间。顺便说一句,异步等待不是解决所有问题的方法。我今天遇到了一种情况,我在一个带有 EF6 的数据库中运行,它只是说它不支持异步操作。与 sql server 完美配合,但这很普遍。完全失望,因为现在我也不得不使用我的第一个想法是异步等待的后台工作人员。

    async await 背后的想法是,如果您正在执行长时间运行的任务,则 gui 线程不会被阻塞。它更像是一个等待点,如果完成了长时间的操作,它将继续。

    其他选项是使用 RX,但难度级别再次增加。

    使用 backgroundworker 就可以了,而且你的 gui 永远不会被阻塞。你甚至可以取消后台工作者的工作。为您提供出色的解决方案。

    【讨论】:

    • 当您可以使用后台工作人员时,您可以使其异步/等待以及从调用站点更干净地使用。
    • yes rufo,但我的意思是 OP 很可能对异步等待不太了解。正如我所说,你不应该使用你不理解的东西。我只是想降低难度。但是,如果 OP 认为他准备好进行异步等待,那么他无论如何都应该使用它。这也是我的第一选择。
    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多