c# - 为什么我的应用程序随着时间的推移变得反应迟钝?
问题描述
我正在调试一个几天后几乎没有响应的 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 上。
解决方案
为什么你在循环中声明秒表?删除循环内可能的任何新声明。
当你这样做时,内存正在增加超时,你指望垃圾收集器来完成工作
推荐阅读
- r - 如何在“R Session Aborted”运行编译代码时找到 Fortran 错误消息?
- netflix-conductor - 为什么 netflix 指挥不提供异步运行任务/子工作流的方法?
- java - MaterialDatePicker,选择结束日期后应用程序崩溃
- php - 如何使用变量内容作为其他变量名的一部分?
- .net-core - IIS 上映射驱动器的 NetworkCredential 不起作用
- node.js - 电子锻造,制作命令:覆盖默认值
- python - 给定两个列表列表查找特定匹配项 - 最快的解决方案
- node.js - React Native 和 IBM Watson
- python - 无法绘制函数
- python - 选择未显示在 django 的选择框中