C# .NET应用程序在长时间不活动后速度非常慢

C# .NET应用程序在长时间不活动后速度非常慢,c#,.net,performance,C#,.net,Performance,我不确定题目是否是最好的,但这是我能想出的最好的题目 我有一个.NET(C#)应用程序,它是用Windows启动的,在计算机关闭之前一直保持打开状态。应用程序停留在托盘上,我通过单击托盘图标打开它,然后以相同的方式关闭它 这个应用一开始并不慢,它工作正常,没有问题。但在长时间的不活动之后,它在长时间内第一次显示时会变得非常缓慢。明白我的意思 例如,我有几天无法使用/打开(单击任务栏图标),在这几天之间,我打开和关闭了许多其他应用程序,也使用了大量的应用程序,我可能会休眠并恢复几次计算机,当我需要

我不确定题目是否是最好的,但这是我能想出的最好的题目

我有一个.NET(C#)应用程序,它是用Windows启动的,在计算机关闭之前一直保持打开状态。应用程序停留在托盘上,我通过单击托盘图标打开它,然后以相同的方式关闭它

这个应用一开始并不慢,它工作正常,没有问题。但在长时间的不活动之后,它在长时间内第一次显示时会变得非常缓慢。明白我的意思

例如,我有几天无法使用/打开(单击任务栏图标),在这几天之间,我打开和关闭了许多其他应用程序,也使用了大量的应用程序,我可能会休眠并恢复几次计算机,当我需要再次打开应用程序时,速度很慢。使用几分钟后,它会恢复正常,工作正常

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


不管是什么原因,我能做些什么来优化我的应用程序吗?

您可以使用来很好地了解应用程序随着时间的推移对内存的使用情况。您可以检查是否有任何东西在您不希望的地方堆积(集合、列表等),并导致内存占用增加。

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

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

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


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

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

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


谢谢。

< P>这不是根本原因的答案或解决方案,但是如果米迦勒是正确的,你没有什么真正可以做的,那么你可能只想在视觉上告诉用户你的应用程序是用进度条或是漂亮的进度循环激活的。p>
它不会加快你的程序,但它可能会让你的用户稍微放松一点

如果问题确实是由于长时间的不活动导致程序被调出,您是否尝试过设置每隔几分钟触发一次的“保持活动”计时器,这基本上将应用程序保持在一种状态,在这种状态下,寻呼系统不会将其视为空闲?

我不确定提高优先级是否是最好的做法-它听起来像是一个后台应用程序,因此让它优先于其他前台应用程序对我来说似乎是个坏主意。我想这完全取决于应用程序的重要性。计时器启动时会做什么?没有什么?还是什么特别的?我想那可能需要一些实验。如果让它执行一个no-op使应用程序不被分页为非活动状态,那就足够了。我的意思是计时器触发了,实际上除了欺骗应用程序使其认为它是活动的之外,没有做任何其他事情。瞧,一个空的方法调用。我明白了,我得试试。。。问题是我没有任何好的方法来测试这个…我只是希望你不要在你的应用程序中使用这些技术。“和别人玩得好”是我的座右铭。不。。。有一些应用程序需要这种控制。例如SQL Server,可能是一些必须有响应保证的嵌入式系统,等等。对于普通的客户端应用程序来说,这几乎从来都不是一个好主意。如果有什么东西在泄漏,我在哪里可以找到?我在process explorer中的任何地方都找不到这些信息……需要观察一段时间。如果对象aor内存计数器持续增长,则表明存在泄漏。