Безопасно ли оборачивать Application.Run (new Form ()) оператором using (...) {}? - PullRequest
2 голосов
/ 18 июля 2011

Я использую внешний API для взаимодействия с камерой FireWire. API, вероятно, написан на C ++, но, к счастью, он имеет свои собственные DLL-библиотеки оболочки .NET. 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. Безопасно ли обернуть Application.Run(...) заявлением using?

1 Ответ

2 голосов
/ 18 июля 2011

Ответ на оба ваших вопроса: да :

  • Dispose() всегда вызывается, когда заканчивается блок using, если Wrapper.Instance не было null, когда блок начался.

  • Совершенно безопасно заключить вызов в Run() в блоке using.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...