使用System.Forms.Timer进行内存泄漏

时间:2010-08-16 10:37:37

标签: .net timer

这是简化的代码块:

private void timer1_Tick(object sender, EventArgs e)
{
    using(Bitmap bmp = new Bitmap(48, 48))
    { }
}

1 个答案:

答案 0 :(得分:2)

由于问题中的信息有限,我只会对似乎问题的一般性作出反应。

您在每个计时器刻度上创建一个小Bitmap。您使用using。这意味着代码包含在try / finally块中。 finally块将调用bmp.Dispose(),它将处理位图。但是,这并不意味着立即清理所有托管资源。这只是在下一个垃圾收集周期清理,然后,只有当没有对位图或其任何引用的引用时才会被清除。

要确定您是否真的有内存泄漏,请删除所有其他代码并使用上面的代码和一些初始化代码创建一个简单的项目。将其放在表单上并向该表单添加一个按钮。单击该按钮时,请执行GC.Collect(),这将清除所有可用的托管资源。如果这不会清理您的资源,则会出现资源泄漏,您应该发布缩小项目的代码。

注意:如果在using - 块内,您使用其他非托管资源而不添加新的using - 块,那么这些资源将不会自动处理掉。围绕展示using的每个类包裹IDiposable - 块。