在我的WinCE中,我有一个WinForm:
public class SyncForm : Form
{
IDisposable someResource;
public SyncForm()
{
someResource = new SomeResource();
}
private void SyncForm_Closed(object sender, EventArgs e)
{
someResource.Dispose();
}
}
当应用程序正确关闭时,它可以正常工作,但如果发生未处理的异常,则不会清除资源。即使我的应用程序崩溃,我应该在哪里确定它被调用?
答案 0 :(得分:3)
转到设计器文件。靠近顶部将是一个被覆盖的Dispose
方法。在Dispose方法中处置该资源。这是设计器文件中唯一由您编辑的方法,因此Visual Studio不会覆盖您在那里编写的内容。也就是说,如果您担心,您可以在正常代码中编写一个单独的方法,只需从Dispose
方法调用即可。
答案 1 :(得分:0)
不要那样做;您必须从Form方法重写Dispose方法。像那样:
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null))
{
components.Dispose();
}
someResource.Dipose(); // <-----
// HERE DISPOSE OTHER STUFF
}
base.Dispose(disposing);
}
您还可以结合Finalize / Dispose模式。
答案 2 :(得分:0)
我是这样做的:
您的表单必须从IDisposable
接口继承。然后将Dispose方法从Designer文件复制到表单Class并创建一个布尔成员bool m_bIsDisposed
。
然后,您使用从IDisposable
继承的方法并调用Dispose(bDisposing)
。这是您从设计器中复制的方法。在Dispose(bDisposing)
方法中,检查成员bDisposed
是否为真。如果不是,则释放托管对象并将其设置为true。
我添加了一个例子。
/// <summary>
/// Call this Method to Destruct all needed Parts safely.
/// </summary>
void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Dispose method
/// </summary>
/// <param name="bDisposing"></param>
protected override void Dispose(bool bDisposing)
{
if (!m_bIsDisposed)
{
// Method called first time.
if (bDisposing)
{
/* Release Managed Objects. If they implement IDisposable, call their Dispose().*/
try
{
// Events, etc.
}
catch { }
this.StopTimer();
this.m_Interceptor.Dispose();
if (components != null)
{
components.Dispose();
}
base.Dispose(bDisposing);
}
// Release unmanaged resources (z.B. IntPtr)
}
// Set it true, so the method doesn't get called again.
m_bIsDisposed = true;
}
答案 3 :(得分:0)
我在这里解决了这个问题
我在Closed事件中以及在全局未处理的异常处理程序中释放资源:
public SyncForm()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
private void SyncForm_Closed(object sender, EventArgs e)
{
someResource.Dispose();
}
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
someResource.Dispose();
}
答案 4 :(得分:0)
可以应用上述所有方法,但您还应该考虑在WinCE中终止用户模式进程的未处理异常的情况下,删除应用程序分配的所有内存,并关闭所有打开的句柄(文件和驱动程序) ,所以系统内部不应有任何泄漏。