定期WMI查询导致内存泄漏?

时间:2011-05-09 08:56:05

标签: c# wmi

我是.NET编程的新手,我目前正在开发一个现已处于婴儿阶段的计算机健康监控系统。我将使用C#2010并使用WMI查询查询计算机信息。

在我进一步开发应用程序之前,我已经创建了一个迷你测试应用程序来测试我的类及其方法。测试应用程序的流程如下:

  1. App startup
  2. 输入主机名,用户名和密码
  3. 单击
  4. 查询按钮并触发查询方法。
  5. 我的UI上的文本字段会更新,打印出查询结果。
  6. 我有一个名为Machine的类,它包含诸如CPU名称之类的属性,以及一些可更新的属性,如当前的CPU使用率。在该类中,我有两个主要方法,GetStaticSysInfo和GetDynamicSysInfo,其中第一个方法查询不随时间变化的系统信息,后一个方法查询CPU和内存使用情况等信息。我有另一个名为Refresh的方法,我用它来包装GetDynamicSysInfo方法。

    当我在我的UI中使用WPF时,我使用DispatcherTimer定期查询机器,并在单击“查询”按钮后将更新的信息打印到UI上的文本字段。但是,我注意到每次调用machine.Refresh()时,应用程序的内存使用量都会增加一些(几百KB)。我无法弄清楚该计划有什么问题,我希望有人可以提供一些建议。

    如果您需要更多信息或代码的任何部分,请与我们联系。

    提前致谢。

    编辑:我在Timer_Tick方法上添加了一个GC.Collect(),看起来内存使用量仍在攀升,但每隔几个计时器滴答一次就会降低一次。它仍在增加,但速度较慢。这是正确的做法,从长远来看会影响性能吗?

1 个答案:

答案 0 :(得分:0)

除了诊断目的,您不应该致电GC.Collect()。运行时有更好的算法来运行GC。此外,经常调用Collect()会导致对象被提升到第1代或第2代,这实际上意味着它们在不再使用后会被收集得更慢,即增加内存占用量。

如果在手动收集后内存再次下降(到之前的值),则表示没有内存泄漏。由于GC不会一直运行,因此GC运行之间的内存会增加。这不用担心。