埋めるのに非常にコストがかかるいくつかのインスタンス変数 (辞書) を含むシングルトン パターン クラスを作成しました。
このクラスは、.NET MVC 4 プロジェクトで使用されます。そして重要なのは、この Singleton クラスのディクショナリによって提供されるデータがあると便利ですが、Web アプリを実行するために必要ではないということです。
言い換えると、Web リクエストを処理するとき、辞書が利用可能であればリクエストは辞書からの情報で拡張されますが、辞書が利用可能でない場合は問題ありません。
したがって、私がやりたいことは、データで満たされている Web アクティビティをブロックすることなく、Singleton 内のこれらの辞書にデータをロードする最良の方法を見つけることです。
私は通常、マルチスレッドでこれを行う方法を見つけますが、過去に ASP.NET 内のマルチスレッド技術を使用して問題に遭遇したことがあります。.NET 4 / MVC 4 で変更はありましたか? これにどのようにアプローチすればよいですか?
アップデート
以下のフィードバックとさらなる調査に基づいて、私が現在行っていることは以下のとおりであり、うまく機能しているようです。誰かが潜在的な問題を見ていますか? 私のテストでは、LazySingleton.Instance を何度呼び出しても、コンストラクターは 1 回だけ呼び出され、すぐに戻ります。LazySingleton.EXPENSIVE_CACHE にすぐにアクセスできますが、探している値が含まれていない可能性があります (.Contains()
呼び出しを使用してアプリでテストしています)。だから、それは働いているようです...
単一のスレッド (LazySingleton コンストラクター) から EXPENSIVE_CACHE ディクショナリを編集するだけの場合、Web アプリでそれを読み取るときにスレッド セーフについて心配する必要はありますか?
public class LazySingleton
{
public ConcurrentDictionary<string, string> EXPENSIVE_CACHE = new ConcurrentDictionary<string, string>(1, 80000); // writing to cache in only one thread
private static readonly Lazy<LazySingleton> instance = new Lazy<LazySingleton>(() => new LazySingleton());
private LazySingleton()
{
Task.Factory.StartNew(() => expensiveLoad());
}
public static LazySingleton Instance
{
get
{
return instance.Value;
}
}
private void expensiveLoad()
{
// load data into EXPENSIVE_CACHE
}
}