假设您永久使用异步调用UI线程/调度程序的方法
while (true) {
uiDispatcher.BeginInvoke(new Action<int, T>(insert_), DispatcherPriority.Normal, new object[] { });
}
在程序的每次运行中,您都会观察到应用程序的 GUI 在大约 90 秒后由于大量调用 开始卡住(时间各不相同,但大致在 1 到 2 分钟之间)。
如何才能准确地确定(测量?)这种重载发生的时间点,以便及早停止它?
附录一:
在我的实际程序中,我没有无限循环。我有一个在终止前迭代数百次的算法。在每次迭代中,我都将一个字符串添加到我的 WPF 应用程序中的列表控件中。我使用了 while (true) { ... } 结构,因为它最符合所发生的情况。事实上,算法正确终止并且所有(数百个)字符串都正确添加到我的列表中,但一段时间后我失去了使用 GUI 的能力,直到算法终止 - 然后 GUI 再次响应。
附录二:
我的程序的目的是在运行时观察特定算法。我添加的字符串是日志条目:每次迭代一个日志字符串。我调用这些添加操作的原因是算法在 UI 线程之外的另一个线程中运行。为了 catch 我无法从 UI 线程以外的任何线程进行 UI 操作这一事实,我构建了某种 ThreadSafeObservableCollection(但我很确定这段代码不值得发布,因为它会影响实际问题我认为是 UI 无法处理方法的重复快速调用。
最佳答案
这很简单:当您让用户的眼球重载时,您就做错了。就现代 cpu 内核而言,这种情况发生得非常快,超过每秒 20 次更新,显示的信息就开始变得模糊。电影院利用了一些优势,电影以每秒 24 帧的速度播放。
任何比这更快的更新都只是在浪费资源。在 UI 线程开始弯曲之前,您仍然有大量的喘息空间。这取决于您要求它完成的工作量,但通常是 x50 安全裕度。基于 Environment.TickCount 的简单计时器将完成工作,当差异 >= 45 毫秒时触发更新。
关于c# - GUI何时过载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320156/