首页 > 解决方案 > 为什么我的应用程序随着时间的推移变得反应迟钝?

问题描述

我正在调试一个几天后几乎没有响应的 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以毫秒为单位绘制了时间:

图形

什么可能导致 Windows 中的性能计数器随着时间的推移变慢?其他应用程序不能清理它吗?有没有办法调试哪些应用程序也在查看这个性能计数器?我在 Windows 10 上。

标签: c#.netperformanceperformancecounter

解决方案


为什么你在循环中声明秒表?删除循环内可能的任何新声明。

当你这样做时,内存正在增加超时,你指望垃圾收集器来完成工作


推荐阅读