使用using(...){}语句包装Application.Run(new Form())是否安全?

时间:2011-07-18 11:28:26

标签: c# c#-3.0 singleton using-statement

我使用外部API连接到FireWire相机。 API可以用C ++编写,但幸运的是它带来了自己的.NET包装器DLL。 API需要以下过程:

ApiResource.Init();
// ... use the ressource here ...
ApiResource.CloseAll();
ApiResource.Release();

因为我需要一些特定的处理代码,所以我决定为此编写一个包装类。因为事件处理程序等,我需要在我的Form打开时保持ressources打开。所以我想让包装器更容易使用我会让它成为一个实现IDisposable的单例,所以我可以将它包装在{ {1}}陈述。我想要Singleton的原因是有一种受控且有限的方式来调用所需的API函数:

using

我想用它的方式是:

class Wrapper : IDisposable {
  private Wrapper _instance;
  public Wrapper Instance
  {
    get
    {
      if(_instance == null)
        _instance = new Wrapper();
      return _instance;
    }
  }

  private Wrapper ()
  {
    ApiResource.Init();
    _disposed = false;
  }

  // Finalizer is here just in case someone
  // forgets to call Dispose()
  ~Wrapper() {
    Dispose(false);
  }

  private bool _disposed;

  public void Dispose()
  {
    Dispose(true);

    GC.SuppressFinalize(this);
  }

  protected virtual void Dispose(bool disposing)
  {
    if(!_disposed)
    {
       if(disposing)
       {
       }
       ApiResource.CloseAll();
       ApiResource.Release();
       _instance = null;
       log("Wrapper disposed.");
       _disposed = true;
    }
  }
}

我对C#很陌生,所以我不确定几件事情:

  1. 上述using(Wrapper.Instance) { Application.Run(new Form()); } 中是否会始终调用Dispose()?我的记录显示“是”,但我不确定......
  2. using(Singleton.Instance) { ... }语句包裹Application.Run(...)是否安全?

1 个答案:

答案 0 :(得分:2)

您的两个问题的答案都是

  • Dispose()将始终在using块结束时被调用,除非块开始时Wrapper.Instancenull

  • Run()块中的using来电包裹起来非常安全。