Я использую внешний 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 #, поэтому я очень не уверен в нескольких вещах:
- Будет ли
Dispose()
всегда вызываться выше using(Singleton.Instance) { ... }
? Моя регистрация предполагает "да", но я не уверен ...
- Безопасно ли обернуть
Application.Run(...)
заявлением using
?