【问题标题】:Windows Forms App Timer Memory Leak?Windows 窗体应用程序计时器内存泄漏?
【发布时间】:2013-09-14 02:12:10
【问题描述】:

我有一个用 c# 编写的非常简单的 Windows 窗体应用程序,它每 30 秒触发一次计时器以检查特定进程是否正在运行。

private void timer1_Tick(object sender, EventArgs e)
{
    Process[] localByName = Process.GetProcessesByName("ahost");

    if (localByName.Length > 0)
    {
        //the process is running...do nothing
    }
    else
    {
        //send me an email
        timer1.Enabled = false;
    }
}

由于它要查找的进程基本上一直在运行,我根本没有点击else 中的电子邮件代码。

这是内存使用情况:

启动 3,580 启动 +1 分钟 3,724 启动 +10 分钟 7,484 启动 +30 分钟 8,024 启动 +60 分钟 7,604

我是否可以假设 GC 正在完成它的工作,因为该应用程序在一小时内只将其内存占用量增加了一倍?

这是标准的 GC 行为吗?

我的小 EXE 是在 VS2010 中针对 .NET Framework 3.0 编写的,并且在 Win2008 R2 服务器上运行。

【问题讨论】:

  • 很难说这是罪魁祸首,可能还有其他原因造成的。您是否正在使用COM objectsGraphicsBitmapsFonts,还有其他可能需要处理的东西?
  • 如果您的应用程序就这么简单,那么它看起来很正常。请参阅stackoverflow.com/questions/15598108/…,我想知道 5 小时后需要的内存..
  • 多娜。不,这些都不是。谢谢。
  • 肯健,谢谢。我去看看。

标签: c# winforms memory-leaks timer


【解决方案1】:

不,没有内存泄漏,这是使用垃圾收集器的语言程序的预期行为。内存将增加,直到最终达到垃圾收集器清理所有不需要的对象的程度。

除非您使用 COM 对象、图形、位图、字体,基本上是任何可能需要处理的非托管资源,否则它不会泄漏。

如果您的应用崩溃,您是否有 B 计划?您可能需要考虑使用服务器的内置函数来执行此操作。您可以通过在 Windows 中配置审核进程跟踪来确定应用程序何时终止。以下链接可能会帮助您入门:

Audit process tracking

How can I track what programs come and go on my machine?

进程跟踪将在 Windows 事件日志中创建条目,然后您可以使用这些条目发送电子邮件。

Send an email when an event is logged

【讨论】:

  • Jermemy,感谢您提醒我服务器已内置工具来处理此问题。我添加了一个任务来监控事件日志,以便在有问题的应用程序出错时向我发送电子邮件。
  • 很高兴能帮上忙:)
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多