为什么我的应用程序随着时间的流逝变得反应迟钝?

时间:2018-12-15 22:28:49

标签: c# .net performance performancecounter

我正在调试C#应用程序,几天后它几乎变得无响应。该应用程序每秒计算一次内存/ CPU使用率,并将其显示在主UI的页脚中。

之所以没有响应,是因为获取RawValue中的PerformanceCounter(“工作集-专用”)需要花费时间。几天后,将花费大约一秒钟的时间来获取RawValue,从而冻结主UI线程。如果重新启动计算机,几天后一切都会很快恢复,直到响应速度变慢为止。如果我在不使用PerformanceCounter代码的情况下重新编译该应用程序(它是开放源代码),它将立即正常运行。

要排除它是应用程序,下面的示例代码可以执行完全相同的操作:

static void Main(string[] args)
{
    using (var memoryWorkingSetCounter = new PerformanceCounter("Process", "Working Set - Private", Process.GetCurrentProcess().ProcessName, true))
    {
        while (!Console.KeyAvailable)
        {
            var memoryWorkingSetSw = new Stopwatch();
            memoryWorkingSetSw.Start();
            var memoryWorkingSetValue = memoryWorkingSetCounter.RawValue;
            memoryWorkingSetSw.Stop();
            Console.WriteLine(memoryWorkingSetValue.ToString());
            Console.WriteLine(memoryWorkingSetSw.Elapsed.ToString());
            Thread.Sleep(TimeSpan.FromSeconds(1));
        }
    }
    Console.Read();
}

我让该程序运行了约2.5天,并以毫秒为单位绘制了Elapsed时间:

graph

什么会导致Windows中的性能计数器随时间变慢?另一个应用程序可能无法清除它吗?有没有办法调试哪些应用程序也在关注此性能计数器?我在Windows 10上。

1 个答案:

答案 0 :(得分:0)

为什么要在循环中声明秒表? 删除循环内所有可能的新声明。

这样做的话,内存会随着时间的增长而增加,并且您依靠垃圾收集器来完成工作