同じ静的オブジェクトを使用する Windows サービスと Windows フォーム アプリケーションがある場合、それは両方のアプリケーションで同じオブジェクトですか? つまり、サービスでオブジェクトを更新すると、両方が同時に実行されている場合、フォーム アプリケーションでも更新されますか?
5 に答える
それらは異なるプロセスで実行されるため、静的オブジェクトを共有しません。
あなたの質問とは正確には関係ありませんが、同じアプリケーションで作成されたスレッドは別の話です。ThreadStatic
属性でマークされていない限り、静的変数を共有します
いいえ。このオブジェクトを達成するために何か特別なことをしない限り、異なるプロセス間で共有されません。
簡単に言うと、
static は ' static per AppDomain
' (プロセスごとに複数のドメインを持つことができます) であるため、1 つのプロセスでさえ、静的変数が「共有」されると想定することは安全ではありません (手動で新しいドメインを作成しない限り、通常は true です。たとえば、AppDomain とは?を参照してください) - たとえば、Web アプリは通常、「静的な」シングルトンなどを壊します。
つまり、異なるアプリケーション間でデータを共有できるようにするには、ある種の永続性を使用する必要があります。または、リモート処理や WCF を使用して、アプリケーション (ドメイン) の境界を越えて通信します。
これに対する簡単な答えは、各プロセスには独自の静的要素があるため、いいえ、サービスとデスクトップ プロセス間で共有されないということです。
複雑な部分は、1 つのプロセスに static の複数のインスタンスが存在する可能性があることです。
クラスをロードするJava
それぞれに対して、静的オブジェクトのインスタンスが 1 つあります。ClassLoader
で同等の機能を確認しましたC#
。私は SO でこの質問を見つけました。これは、複数のクラスローダーに似たものが実際にあることを示唆しています(実際には にあるC#
と思いCLR
ます)。静的の複数のインスタンスへの特定の参照は見つかりませんでしたが、そうであると確信しています。
各アプリケーションは独自のプロセスで実行されると思います。Windows サービスで静的オブジェクトを更新すると、Windows フォーム アプリケーションとして実行されている静的オブジェクトに何らかの影響があるとは思えません。
Windows サービスはsystem
アカウントで実行されますが、Windows フォーム アプリケーションはUser
アカウントで実行されます。
他の人がコメントで指摘したように、プロセスは異なるメモリで実行されます。各プロセスには、独自のアドレス空間があります。
Windows サービスは、サービス コントロール マネージャーのコマンドに応答します。
それらは完全に2つの異なるものです。