В настоящее время у меня есть синглтон, для инициализации которого может потребоваться до 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 дважды при запуске.
б) Я хотел бы выполнить потоки внутри синглтона, но что-то должно инициировать инициализацию.
Есть ли более чистый / приятный / лучший способ справиться с этим?
Заранее спасибо за помощь всем.
** РЕДАКТИРОВАТЬ: Как указано в комментариях, Иниции было ошибочно определено как частное. Это должно быть публично и было исправлено.