私は、達成しようとしていることについての合意を探すのに約 1 時間費やしてきましたが、特定の方向で決定的なものをまだ見つけていません。
私の状況は次のとおりです。
- マルチスレッド アプリケーション (.NET Web サービス) を使用しています。
- ロードに無視できない時間がかかるオブジェクトを使用するクラスがあるため、それらを静的クラス メンバーとして維持したいと考えています。
- これらのオブジェクトを断続的に構築するコードは、失敗する可能性が低い
以前は、静的コンストラクターでこれらのオブジェクトを構築するアプローチを使用していました。これに関する問題は、前述のように、コンストラクターが失敗することがあり、.NET 静的コンストラクターが失敗すると、プロセスが再起動されるまでクラス全体が停止することでした。そのアプローチには二度目のチャンスはありません。
この後、最も直感的に見えるアプローチは、ダブルチェック ロックを使用することでした。ダブルチェックされたロックの悪さについて話し、静的コンストラクターを使用するように言うページがたくさんありますが、これは私がすでに行っていましたが、静的コンストラクターには失敗してクラス全体がダウンする可能性があります。
私が使用しようと考えている実装(もちろん簡略化されたもの)は次のとおりです。すべてのクラスとメンバーの名前は純粋に説明的なものであり、私が実際に使用しているものではありません。このアプローチは問題になるでしょうか?誰でもより良いアプローチを提案できますか?
public class LazyMembers
{
private static volatile XmlDocument s_doc;
private static volatile XmlNamespaceManager s_nsmgr;
private static readonly object s_lock = new object();
private static void EnsureStaticMembers()
{
if (s_doc == null || s_nsmgr == null)
{
lock (s_lock)
{
if (s_doc == null || s_nsmgr == null)
{
// The following method might fail
// with an exception, but if it succeeds,
// s_doc and s_nsmgr will be initialized
s_doc = LoadDoc(out s_nsmgr);
}
}
}
}
public XmlNamespaceManager NamespaceManager
{
get
{
EnsureStaticMembers();
return s_nsmgr;
}
}
public XmlDocument GetDocClone()
{
EnsureStaticMembers();
return (XmlDocument)s_doc.Clone();
}
}