静的クラスのスコープは何ですか?
-
08-07-2019 - |
質問
一度に複数のプロセスで使用できるアセンブリがあります。静的クラスを使用している場合、複数のプロセスはすべて同じ「インスタンス」を使用しますか?そのクラスの?
プロセスは独立しているため、これらは異なるアプリケーションドメインで実行されるため、静的な「インスタンス」があります。別に?
ここでの詳細は、カスタムBizTalkアダプターによってアセンブリが使用されており、並列バッチでメッセージを処理するように設定されていることです。それが私が「複数のプロセス」と呼んでいるものです。上記。
解決
複数のスレッドがインスタンスを共有します。このため、静的クラスはスレッド間で状態を渡すのに便利ですが、競合状態( Monitor
または lock
のプロパティ)を導入しないように非常に注意する必要があります。
ただし、複数のプロセスは別々のAppDomainに存在する必要があるため、それぞれに独自のインスタンスがあります。
他のヒント
静的クラスは、アプリケーションドメインごとに1つ存在します。あなたの場合、アダプターが同じアプリケーションドメインで複数のスレッドを使用している(したがって、静的クラスの単一インスタンスを共有している)か、複数のプロセスを使用している(したがって、静的クラスの個別のインスタンスを持っている)かどうかに依存します。
"私は、一度に複数のプロセスで使用できるアセンブリを持っています。静的クラスを使用している場合、複数のプロセスはすべて同じ「インスタンス」を使用しますか?そのクラスの?"
いいえ、それらはすべて別々のインスタンスを持っています。
"プロセスは独立しているため、これらは異なるアプリケーションドメインで実行されるため、静的な「インスタンス」があります。別に?"
はい。
静的クラスのスコープは、アプリケーションドメインに制限されています。各アプリドメインには、静的変数の独自のコピーがあります。 「プロセス」が同じアプリドメイン内のスレッドである場合、静的な値を共有します。しかし、それらが実際に別個のWindowsプロセスである場合、それらは異なるアプリドメインを持つため、別個のコピーになります。
シングルトンパターンを確認することもできます。要点は、サービスインスタンスの数を制御することです。
すべてのクライアントリクエストを処理する別個のdll /プロジェクトが必要だと思います。静的クラス/シングルトン/マルチトンを使用して、必要な機能を実装できます。それは本当にあなたが達成しようとしていることに依存します。