Существует этот объект, похожий на соединение с БД, который понадобится моему веб-приложению. Он довольно медленный для создания и будет использоваться редко, поэтому я хотел бы сохранить только один его экземпляр. Если это требуется нескольким запросам одновременно, они будут lock()
объект и сериализовать свой доступ.
Чтобы сделать вещи более увлекательными, объект является IDisposable и может быть закрыт. Естественно, я буду избегать написания кода, который его закрывает, но ... вы знаете ... лучше, чем потом сожалеть, верно?
Итак, наивным подходом было бы реализовать его примерно так:
private static DBClass _Instance;
private static object _DBLock = new object();
public DBClass GetDB()
{
if ( _Instance == null )
lock (_DBLock )
if ( _Instance == null )
_Instance = CreateInstance();
lock (_Instance)
if ( _Instance.Disposed )
_Instance = CreateInstance();
return _Instance;
}
Затем будет использоваться как:
lock (var Conn = Global.GetDB() )
{
// Use Conn here.
}
Это, вероятно, будет работать большую часть времени, но я вижу открытие, которое можно использовать - если два потока вызывают это одновременно, они получают один и тот же экземпляр в одно и то же время, и тогда один может все еще Dispose()
это прежде, чем другой приобретет lock()
на этом. Таким образом - позже код не работает. Проверка на Disposed
в каждом месте, где он используется, также кажется неудобной. На самом деле, lock()
это тоже кажется неловким, но этот экземпляр не является поточно-ориентированным, поэтому я ничего не могу с этим поделать.
Как бы вы это реализовали?