繁体   English   中英

长时间不活动后,.NET应用程序非常慢

[英].NET Application very slow after long period of inactivity

我不确定问题标题是否是最好的,但它是我能想到的最好的...

我有这个.NET(C#)应用程序,它启动Windows并保持打开,直到计算机关闭。 应用程序停留在托盘上,然后单击托盘图标将其打开并以相同方式关闭它。

该应用程序一开始并不慢,它正常工作,没有问题。 但是经过长时间的不活动,在很长一段时间内第一次再次显示它时会变得很慢。 明白我的意思了吗。

例如,我无法使用/打开(点击托盘图标)几天,在那些日子里我打开和关闭并使用了很多其他应用程序,也是重型应用程序,我可能已经休眠并重新启动计算机几次,当我需要再次打开我的应用程序,这很慢。 使用几分钟后,它恢复正常并正常工作。

我相信这与内存管理有关,系统可能会释放我应用程序的大部分内存,因此其他程序可以更有效地使用它。 也许.NET内存管理与它有关...

无论是什么原因,我可以做些什么来优化我的应用程序的问题?

这几乎可以肯定是由于内存被分页到磁盘。

当您停止使用您的应用程序和其他应用程序或任务开始施加内存压力时,应用程序中的内存页面可以写入磁盘。 当您再次尝试使用您的应用程序时,必须读入所有这些数据,从而导致您看到的停顿。

不幸的是,没有好的解决方案 - 如果您以管理员身份运行或拥有SeLockMemoryPrivilege,您可以将应用程序的某些部分锁定到物理内存中。 您可以定期尝试“触摸”页面以将它们保存在物理内存中。 不幸的是,这两个选项都会导致您的应用程序与系统上的其他应用程序进行严重交互 - 您的内存将被分页,因为其他内容需要物理内存。 您可以尝试降低总体内存占用量,但在某些情况下仍会遇到此问题。 有一些选项可以调整你的工作集大小,但操作系统可以自由地忽略这些,并且在很多情况下也是如此。

您可以使用.NET内存分析器来了解应用程序随着时间的推移对内存执行的操作。 您可以检查是否有任何内容正在建立在您不期望的位置(集合,列表等)并导致您的内存占用增长。

您是否尝试在正在运行的应用程序上双击Process Explorer并观察它是否泄漏? 是CPU利用率,UI泄漏,内存泄漏,重复I / O?

如果问题确实是由于长时间不活动而导致程序被分页,您是否尝试设置“保持活动”计时器,每隔几分钟触发一次,这基本上使应用程序处于寻呼系统的状态有没有看到它闲置?

我认为这种行为在Windows中是正常的。 Windows将提供最需要的应用程序,即当前使用的应用程序。 因此,如果应用程序被最小化或长时间不活动(如上面指定的情况),它将是Windows 寻呼应用程序内存并为活动应用程序提供可用内存的最佳候选者。 Windows将从分页内存(硬盘)激活后恢复应用程序内存,这就解释了为什么它很慢。

这可能不是最好的答案,但如果我是你,我将通过增加应用程序的基本优先级来进行实验。 这可以通过在.NET框架中使用Thread对象来完成。

谢谢。

这不是根本原因的答案或解决方案,但如果迈克尔是正确的并且您无法真正做到这一点,那么您可能只是想通过进度条或漂亮的进度圈在视觉上通知用户您的应用程序处于活动状态。

它不会加速你的程序,但它可以让你的用户的思想稍微放松一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM