在主窗口正忙或正在执行某些任务时打开自定义忙指示符

我的应用程序基于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,如代码所示。

回答:

容易解决

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

回到顶部