我目前有一個單例,最初可能需要10秒才能初始化。但是,我不希望我的用戶對此進行初始化處理(等待),所以我寧願在啓動應用程序時在後臺線程上引導此組件。下面是我有:在後臺線程上初始化一個單例的常見模式
辛格爾頓:
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()的人。
但是,由於兩個原因,它感覺有點笨拙: a)我將在啓動時兩次進入Init方法。 b)我想在單例內部進行線程化,但是必須啓動初始化。
是否有一個更清潔/更好/更好的方式來處理?
在此先感謝大家的幫助。
**編輯:正如在評論中指出的那樣,Init被誤認爲是私有的。它應該是公開的,並已得到糾正。
您應該使用'懶<>'來初始化單[如宣揚的喬恩斯基特(http://csharpindepth.com/Articles/ General/Singleton.aspx)卸載初始化,直到實際使用單例。 – 2012-03-28 04:15:10
Jon在那篇文章中寫道:「我個人的偏好是針對解決方案4:」這不是懶惰的解決方案。請閱讀文章,瞭解他的推理和更多信息。 –
2012-03-28 04:19:39
@MitchWheat - 嘿,我想(在10次以上的閱讀中)我從來沒有閱讀過這些例子的文章。這會教我如何保持我的舌頭(可能不是) – 2012-03-28 04:30:08