在主窗口正忙或正在执行某些任务时打开自定义忙指示符
我的应用程序基于WPF。在主窗口正忙或正在执行某些任务时打开自定义忙指示符
任务是我需要显示一个自定义的繁忙指标,而一些工作在主窗口(因为应用程序的用户界面将冻结,直到它完成任务)。所以我特别想是如下
// Code in main window CustomBusyIndicator.ShowDialog();
//....
//..code that takes time
//....
CustomBusyIndicator.Close();
所以我必须实现,必须能够灵活地在我的主要应用程序的任何地方打电话,指示繁忙的窗口。
这两点应该牢记, 1.当我告诉CustomBusyIndicator,在背景中的主窗口,应运行它的任务 2.当我告诉CustomBusyIndicator的CustomBusyIndicator应该总是在主窗口顶部,用户必须无法使用主窗口,如果他使用Start + Tab切换到其他应用程序,并且切换回我的应用程序时,CustomBusyIndicator应该位于顶部(如果未关闭)。
当任务完成后,我应该能够调用close()方法来关闭CustomBusyIndicator,如代码所示。
回答:
容易解决
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();
}
}
回答:
如果你不知道如何使用异步工作伺机,只需将您的长期运行的逻辑在一个BackgroundWorker。有几个选项可以让背景工作者与主GUI线程通信,而不会出现任何问题。 根据你的问题和你的经验水平,我认为你是异常的等待你的头。但Rufo的解决方案也很好。
谷歌是你的朋友,有很多关于使用backgroundworker和关于异步的信息也在等待。完全掌握异步等待的可能性需要更长的时间。异步等待btw不是一切的解决方案。今天遇到了一个情况,我在EF6上运行数据库时只是说它不支持异步操作。与sql server很好地工作,但这是普遍的。完全失望,因为现在我也不得不使用后台工作,我的第一个想法是异步等待。
async等待的想法是,如果您正在执行长时间运行的任务,则gui线程不会被阻止。它更像是一个等待点,如果长时间的操作完成,它将继续下去。
其他选项是使用RX,但难度级别再次提高。
使用背景工作,你很好,你的gui永远不会被阻止。你甚至可以取消背景工作者的工作。优秀的解决方案。
以上是 在主窗口正忙或正在执行某些任务时打开自定义忙指示符 的全部内容, 来源链接: utcz.com/qa/260069.html