如何确保要清理的非托管资源

时间:2013-11-18 16:52:24

标签: c# winforms windows-ce

在我的WinCE中,我有一个WinForm:

public class SyncForm : Form
{
 IDisposable someResource;
 public SyncForm()
 {
  someResource = new SomeResource();
 }

        private void SyncForm_Closed(object sender, EventArgs e)
        {
            someResource.Dispose();
        }
}

当应用程序正确关闭时,它可以正常工作,但如果发生未处理的异常,则不会清除资源。即使我的应用程序崩溃,我应该在哪里确定它被调用?

5 个答案:

答案 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中终止用户模式进程的未处理异常的情况下,删除应用程序分配的所有内存,并关闭所有打开的句柄(文件和驱动程序) ,所以系统内部不应有任何泄漏。