在主窗口忙或执行某项任务时打开自定义忙碌指示灯

时间:2017-12-03 08:31:57

标签: c# .net wpf xaml mvvm

我的应用程序基于WPF。

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

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

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

这里应该记住两点, 1.当我显示CustomBusyIndi​​cator时,在后台主窗口应该运行它的任务 2.当我显示CustomBusyIndi​​cator时,CustomBusyIndi​​cator应始终位于主窗口之上,如果用户使用“开始+”选项卡切换到其他应用程序,或者当切换回我的应用程序时,用户必须无法使用主窗口,CustomBusyIndi​​cator应位于顶部(如果未关闭)。

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

2 个答案:

答案 0 :(得分:0)

易于解决

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();
    }
}

答案 1 :(得分:0)

如果您不知道如何使用异步等待,只需在后台工作中移动长时间运行的逻辑。有几个选项可以让后台工作者在没有主GUI线程问题的情况下进行通信。 根据您的问题和您的经验水平,我认为您可以通过异步等待来解决问题。但Rufo的解决方案也很好。

Google是您的朋友,有很多关于使用backgroundworker的信息以及有关async等待的信息。完全掌握异步等待的潜力需要更长的时间。异步等待是不是一切的解决方案。今天我遇到了一个情况,我在EF6的数据库中运行,只是说它不支持异步操作。与sql server完美配合,但这种情况很普遍。完全失望,因为现在我也必须使用背景工作者,我的第一个想法是异步等待。

异步等待的想法是,如果你正在执行一个长时间运行的任务,gui线程不会被阻止。它更像是一个等待点,如果该长操作完成它将继续。

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

使用背景工作者,你很好,你的gui永远不会被阻止。您甚至可以取消后台工作人员的工作。优秀的解决方案。