我目前正在开发一个项目,我们在MDI控制器中使用了几个非常可控的重型用户控件。这是一个业务线应用程序,它是非常数据驱动的。
我们面临的问题是前面提到的控制装置会非常缓慢地加载,我们将脚趾浸入多线程水域以控制负载,但这并不是出于多种原因的解决方案。我们提高控件性能的解决方案最终是将表单“预加载”到隐藏窗口,创建现有表单的堆栈,并在用户请求表单时弹出堆栈。
现在,当我们将这个'修复'推送给我们的测试人员时,我看到的当前问题将会出现,最终我们的用户就是这样:
目前,包含预加载表单的“隐藏”窗口在任务管理器中可见,并且可以关闭,从而导致所有控件丢失。然后你必须在飞行中创建它们而失去性能提升。其次,当用户用完堆栈时,我们会失去性能提升(目前的解决方案将在下面讨论)。
对于第一个问题,是否有办法从任务管理器中隐藏此窗口,可能是通过创建一个封装程序主窗体和隐藏窗体的父窗体?
我们当前解决第二个问题的方法是使用一个不活动计时器,当它触发时检查表单的堆栈,并在堆栈未满时将新表单加载到堆栈中。但是,这仍然有可能在创建表单时导致UI挂起。一个可能的解决方案是将“使用过的”表单放回到堆栈中,但我觉得可能有更好的方法。
编辑:用于控制设计说明
从评论中我已经意识到控制正在做什么是不明确的。
以下是其中一个控件的详细说明。
我已将此控件加载时间定义为用户执行打开控件的操作所需的时间,直到可以编辑控件的时间为止。
该控件用于输入系统中患者的处方,它有大约5个选项卡组,总共约180个控件。用户选择从主程序内部打开一个新的处方控件,该控件被加载到主窗体的MDI子区域(这是一个DevExpress功能区控件)。从用户单击“新建”(或加载现有记录)到控件可见之间。程序中发生的操作列表如下:
检查堆栈是否存在控件。 如果控件存在,它将从堆栈中弹出。 控件在屏幕上呈现。 这需要2秒 然后使用空白对象或现有数据填充控件。 该控件已准备就绪。
加载时间的平均百分比,在大约10台不同的机器上,使用不同的硬件控制渲染需要大约85-95%的控制加载时间。
在不使用堆栈的情况下,控件需要大约2秒才能加载,堆栈需要大约0.8秒,第二次是可以接受的。
我查看了Henry的链接,之前我已经实施了适用的建议。
我再次重复我的问题是什么是尽可能少的UI中断将控件移入和移出堆栈的最佳方法?
答案 0 :(得分:3)
加速Windows窗体应用程序的12个技巧
http://devcomponents.com/blog/?p=361
...包含一些好的提示。我先把它们用尽。
如果你真的是非常数据驱动的,我会确保你正在做通常的事情来确保速度,比如只选择你需要的列,并明智地使用存储过程。检查数据库实践;确保您有需要它们的索引。描述您的数据请求;找出哪些是最慢的,并优化它们。
您很有可能将80%到90%的时间花在表单活动的10%到20%上。找出这些痛点的位置,并专注于它们。
答案 1 :(得分:2)
我们提高控件性能的解决方案最终是将表单“预加载”到隐藏窗口,创建现有表单的堆栈,并在用户请求表单时弹出堆栈。 / p>
“将表格预加载到隐藏的窗口上”是什么意思?
使用.NET对象模型,您应该能够根据需要实例化多个表单,在通用集合(例如列表)中跟踪它们,并根据需要简单地设置.Visible和.MDIParent属性。 / p>
我们对第二个问题的当前解决方案是使用一个不活动计时器,当它触发时检查表单的堆栈,并在堆栈未满时将新表单加载到堆栈中。
为什么这些表格会被破坏?它们不能被清除并重新使用吗?
答案 2 :(得分:1)
对于任务栏,winforms有一个名为“ShowInTaskBar”的属性将其设置为false。至于线程,所有的数据操作都应该在它自己的线程/线程上。也不确定它是否会有所帮助,但表格上还有一个双重缓冲属性。