我正在调试一款C#应用程序,这款应用程序经过几天后变得几乎无法响应。该应用程序每秒计算内存/CPU使用情况,并在主用户界面的页脚中显示它。
导致不响应的原因是获取PerformanceCounter
("工作集 - 私有")的RawValue
所需的时间过长。几天后,获取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天,并将时间以毫秒为单位制成了图表:
是什么原因导致Windows性能计数器随着时间推移变得缓慢?可能有其他应用程序没有清理它吗?有没有一种方法可以调试哪些应用程序也在查看此性能计数器? 我正在使用Windows 10。
PerformanceCounter
变量的作用域缩小到仅限于.RawValue
调用周围,会发生什么?也许该对象会随着时间保留数据。 - Nathan Werryusing
,也不会销毁该对象;尝试将此块移动到一个方法中,在while循环中调用该方法。 - Abhinaw Kaushik