我一直在修复winforms应用程序中的一些内存泄漏问题,并注意到一些不显式放弃的对象(开发人员没有称为Dispose方法)。 Finalize方法的实现也没有帮助,因为它不在if (disposing)
子句中。所有的静态事件注销和收集清除已放入if (disposing)
条款。最好的做法是调用的Dispose如果对象是一次性的,但不幸的是如果有非托管对象,静态的事件处理程序和需要处置时,清除一些管理的集合这种情况有时一次性实现 - 应该如何处理'if(disposing)'
。有什么方法可以决定什么应该进入以及应该从if (disposing)
条款中排除。
// Dispose(bool disposing) executes in two distinct scenarios.
// If disposing equals true, the method has been called directly
// or indirectly by a user's code. Managed and unmanaged resources
// can be disposed.
// If disposing equals false, the method has been called by the
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
It says管理对象应在if (disposing)
通常只有执行时显式调用Dispose方法由开发商。如果Finalize方法已经实现并且开发人员忘记调用Dispose方法,那么通过Finalizer进行的执行不在if (disposing)
部分。
以下是我的问题。
如果我有导致内存泄漏的静态事件处理程序,我应该在哪里取消注册它们?有没有
if (disposing)
条款?如果我有一些导致内存泄漏的集合,我应该在哪里清除它们?有没有
if (disposing)
条款?如果我使用第三方的一次性对象(例如:devExpress winform控件),我不确定它们是托管对象还是非托管对象。假设我想在处理表单时处理它们。我怎么知道什么是管理的,什么是非管理对象?一次性使用不是这样说的吗?在这种情况下,如何确定应该进入哪些内容以及从
if (disposing)
条款中应该列出哪些内容?如果我不确定某件事情是否管理或不受管理,那么
if (disposing)
子句中处理/清除/取消注册事件的不良后果是什么?假设它在处置之前检查为空?
编辑
我的意思是事件未登记是一样的东西下面。 Publisher是一个长期存在的实例,下面一行是订阅者的构造函数。在这种情况下,用户需要取消注册该事件并在发布者之前进行处置。
publisher.DoSomeEvent += subscriber.DoSomething;
实例订阅静态事件并不罕见。这些实例应该在if(Disposing)子句中取消订阅。 – supercat