假设你是永久在 UI 线程/调度程序上异步调用方法
while (true) {
uiDispatcher.BeginInvoke(new Action<int, T>(insert_), DispatcherPriority.Normal, new object[] { });
}
每次运行程序时,您都会观察到应用程序的 GUI 在大约 90 秒后开始冻结,因为大量的祈求(时间各不相同,但大致在 1 到 2 分钟之间)。
当这一点发生时,如何准确地确定(测量?)这一点?超载为了尽早阻止它发生?
附录一:
在我的实际程序中,我没有无限循环。我有一个算法,在终止之前会迭代数百次。在每次迭代中,我都会向 WPF 应用程序中的列表控件添加一个字符串。我使用了 while (true) { ... } 构造,因为它最匹配发生的情况。事实上,算法正确终止,所有(数百个)字符串都正确添加到我的列表中,但一段时间后,我失去了使用 GUI 的能力,直到算法终止 - 然后 GUI 再次响应。
附录二:
我的程序的目的是在运行时观察特定的算法。我添加的字符串是日志条目:每次迭代一个日志字符串。我调用这些添加操作的原因是该算法在 UI 线程之外的另一个线程中运行。为了赶上我无法从 UI 线程以外的任何线程进行 UI 操作的事实,我构建了某种 ThreadSafeObservableCollection (但我很确定这段代码不值得发布,因为它会偏离实际问题我认为是UI无法处理方法的重复和快速调用。
这非常简单:当你让用户的眼球超载时,你就做错了。就现代 CPU 核心而言,这种情况发生得相当快,超过每秒 20 次更新,显示的信息就开始变得模糊。电影院利用了这一点,以每秒 24 帧的速度播放电影。
更新速度超过这个速度只是浪费资源。在 UI 线程开始崩溃之前,您仍然有大量的喘息空间。这取决于您要求它完成的工作量,但典型的是 x50 安全裕度。基于Environment.TickCount 的简单计时器将完成工作,当差异 >= 45 毫秒时触发更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)