В настоящее время у меня есть синглтон, инициализация которого может занять до 10 секунд. Однако я не хочу, чтобы мои пользователи наказывались (ожидая) этой инициализации, поэтому я бы предпочел загружать этот компонент в фоновом потоке во время запуска приложения. Вот что у меня есть:
Singleton:
public class MySingleton
{
private static MySingleton _instance;
private static readonly object _locker = new object();
private MySingleton()
{
Init();
}
public static MySingleton Instance
{
if(_instance == null) _instance = new MySingleton();
return _instance;
}
public void Init()
{
lock(_locker)
{
if(_instance != null) return;
// long running code here...
}
}
}
Запуск приложения:
Task.Factory.StartNew(() => MySingleton.Instance.Init());
Этот код действительно работает, защищает от двойной инициализации, защищает от крайних случаев, когда пользователю это нужно до завершения инициализации, а также защищает от того, чтобы кто-то забыл вызвать Инит().
Тем не менее, он кажется немного неуклюжим по двум причинам: а) Я собираюсь дважды использовать метод Init при запуске. б) Я хотел бы сделать потоки внутри синглтона, но что-то должно инициировать инициализацию.
Есть ли более чистый/красивый/лучший способ справиться с этим?
Заранее всем спасибо за помощь.
** РЕДАКТИРОВАТЬ: Как указано в комментариях, область действия Init была ошибочно определена как закрытая. Это должно быть общедоступным и было исправлено.