2017-12-03 90 views
0

我的应用程序基于WPF。在主窗口正忙或正在执行某些任务时打开自定义忙指示符

任务是我需要显示一个自定义的繁忙指标,而一些工作在主窗口(因为应用程序的用户界面将冻结,直到它完成任务)。所以我特别想是如下

// 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,如代码所示。

回答

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

不错的解决方案,但如果OP不知道异步等待,我不会建议他使用它。一个简单的编程规则。不要使用你不明白的东西。我决不会对Rufo的解决方案产生负面影响,完全不是这是一个更好的解决方案,而且比我的更现代化。我只是在预测OP的经验,这个问题说明了一切。我不认为他对线程知之甚多。 –

0

如果你不知道如何使用异步工作伺机,只需将您的长期运行的逻辑在一个BackgroundWorker。有几个选项可以让背景工作者与主GUI线程通信,而不会出现任何问题。 根据你的问题和你的经验水平,我认为你是异常的等待你的头。但Rufo的解决方案也很好。

谷歌是你的朋友,有很多关于使用backgroundworker和关于异步的信息也在等待。完全掌握异步等待的可能性需要更长的时间。异步等待btw不是一切的解决方案。今天遇到了一个情况,我在EF6上运行数据库时只是说它不支持异步操作。与sql server很好地工作,但这是普遍的。完全失望,因为现在我也不得不使用后台工作,我的第一个想法是异步等待。

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

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

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

+0

当您可以使用背景工作者时,您可以使其成为异步/等待,并且可以从调用站点获得更多干净的用途。 –

+0

是rufo,但我的观点是OP很可能不太了解异步等待。正如我所说,你不应该使用你不明白的东西。我只是想降低难度级别。但是,如果OP认为他需要异步等待,他应该尽其所能。这也是我的第一选择。 –

相关问题