Общий шаблон для инициализации синглтона в фоновом потоке

В настоящее время у меня есть синглтон, инициализация которого может занять до 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 была ошибочно определена как закрытая. Это должно быть общедоступным и было исправлено.

6
задан pdalbe01 28 March 2012 в 14:16
поделиться