Как правильно реализовать многопоточный синглтон с возможностью в любой момент и из любой нити освободить все занятые ресурсы и так чтобы при следующем запросе они снова лениво разворачивались.
Ответ
А в чём проблема? Ну окружите весь доступ мьютексом. Поскольку вам нужна логика реинициализации, простое решение с Lazy
public sealed class Singleton
{
// классическая реализация из статьи Jon Skeet'а
// http://csharpindepth.com/articles/general/singleton.aspx
private static readonly Lazy
public static Singleton Instance { get { return lazy.Value; } }
private Singleton() { }
/////////////////// ленивые свойства ///////////////////
object accessMutex = new object();
string lazyProperty;
public string LazyProperty
{
get
{
lock (accessMutex)
return lazyProperty ?? (lazyProperty = CreateLazyProperty());
}
}
public void Reset()
{
lock (accessMutex)
{
lazyProperty = null;
// обнулите остальные свойства, освободите IDisposable-ресурсы
}
}
string CreateLazyProperty() { ... }
}
Комментариев нет:
Отправить комментарий