【问题标题】:Is it safe to wrap Application.Run(new Form()) with a using(...) { } statement?用 using(...) { } 语句包装 Application.Run(new Form()) 是否安全?
【发布时间】:2011-07-18 11:28:25
【问题描述】:

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

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

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

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;
    }
  }
}

我想使用它的方式是这样的:

using(Wrapper.Instance) {
  Application.Run(new Form());
}

我对 C# 还很陌生,所以我不太确定以下几点:

  1. Dispose() 是否总是在上面的using(Singleton.Instance) { ... } 中被调用?我的日志显示“是”,但我不确定...
  2. using 语句包装Application.Run(...) 是否安全?

【问题讨论】:

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


    【解决方案1】:

    你的两个问题的答案都是是的

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

    • 将对Run() 的调用封装在using 块中是非常安全的。

    【讨论】:

    • 感谢您回答我的问题!
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多