私は現在シングルトンを持っていますが、初期化には最大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に対するガードは、ユーザーのエッジケースに対するガードがそれを仕事必要としませんイニシャライズを行い、Init()の呼び出しを忘れた人を守ります。
しかし、それは2つの理由でちょっと気難しいと感じています。 a)起動時にInitメソッドに2回移動します。 b)シングルトン内でスレッドを実行したいが、何かが初期化を開始しなければならない。
これを処理するクリーナ/ニース/より良い方法がありますか?
ありがとうございました。
** EDIT:コメントで指摘されているように、Initはプライベートとして誤ってスコープされていました。公開され、訂正されている必要があります。
あなたのシングルトンを初期化するために、 '><'レイジーを使用する必要があります[ジョンスキートで説教として](http://csharpindepth.com/Articles/ General/Singleton.aspx)を使用して、シングルトンが実際に使用されるまで初期化をオフロードします。 –
Jonは記事「私の個人的な好みは解決策4です:」にあります。これはLazyソリューションではありません。彼の推論と詳細についての記事をお読みください。 –
@MitchWheat - Heh、私は10回以上読んだことがありますが、過去の記事を読んだことはありません。それは私の舌を保持するために私に教えてくれるでしょう(おそらくそうではありません) –