c# - GUI何时过载?

标签 c# user-interface asynchronous dispatcher begininvoke

假设您永久使用异步调用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/

相关文章:

javascript - 什么是好的 JavaScript 超高级 UI 框架?

javascript - 使用 sequelize 获取下一条记录

.net - 流多播 - 一次读取一个流,但以不同的方式处理它,缓冲最少

javascript - Mongo 不接受插入重复的用户名

c# - 在 C# 中发送要在服务器上执行的代码 - 就像 Java RMI

java - 基本Java : WOD with GUI (needing pauses/stops)

C# 堆栈推送调用问题

silverlight - UI和View在术语上的区别以及在哪种情况下正确

c# - 如何比较 POCO 之间的字段/属性?

c# - 如何注入(inject) Application Insights 代码以监视所有方法中的计时