1

サービスが一連のプロセスをバックグラウンドで実行している状況があります。これらのプロセスは、必要に応じて GUI アプリケーションから開始/停止する必要があります。問題は、実行中のプロセスのリストが、それらを監視および制御するように設計されたオブジェクトのメモリに保持されていることです。このオブジェクトはサービス インスタンス上にあるため、GUI アプリケーション インスタンスからはアクセスできません。私が必要だと思うのは、そのオブジェクトをミューテックスのように、マシン上でグローバルに静的なシングルトンに変換して、GUI からメソッドを実行し、サービスに影響を与えることができるようにすることです。以下にコード例を示します。これは私が持っているコードではなく、大幅に簡略化したバージョンです。Mutex ベースのシングルトンのソリューション、または私のニーズにより適した代替ソリューションに興味があります。

namespace SystemWideSingleton
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write("Count = " + GlobalSingleton.Instance.Count++);
                Console.ReadLine();
            }
        }
    }

    public class GlobalSingleton
    {
        static GlobalSingleton() { }

        private GlobalSingleton()
        {
            Count = 0;
        }

        private static readonly GlobalSingleton _instance = new GlobalSingleton();
        public static GlobalSingleton Instance { get { return _instance; } }

        public int Count { get; set; }
    }
}

上記のコードが 2 つのコンソール アプリケーションとして実行され、各アプリケーションが出力を共有することが期待されます。元。

Application 1:  Application 2:
--------------  --------------
0               0
1               3
2               4
5               7
6               8

どんな助けでも大歓迎です。

PSシングルトンから得られるのは、同じアプリケーションインスタンスのスレッド間で機能することだけです。マシン上のインスタンス全体で機能する必要があります。

4

3 に答える 3

0

いくつかのオプションが提案されています。私はそれらの1つを選びます。別のプロセスのメモリを直接読み取ることは簡単ではないことに注意してください。これは、OSおよび.NETCLRで強制されたセキュリティです。あなたは規則に従い、正しくプレーしなければなりません。

おそらく、これを行う最も簡単な方法は、ファイルでバックアップされたグローバルミューテックス(それを使用するための最良のパターンに関する議論)を使用することです。ここには、多数のアクティブなインスタンスが格納されます。多くのバリエーションがあります:このカウンターをレジストリ、データベース、XMLファイル、テキストファイルに保存します。

または、マスター(サーバー)アプリケーションにカウンターを格納し、RPC / WCF / SOAP / RESTなどを使用してスレーブ(クライアント)からカウンターをクエリ/更新することもできます。

于 2012-12-17T20:44:12.403 に答える
0

あなたが見つけようとしているのは、この問題に対する「魔法の.NET」ソリューションがないということだと思います。プロセス間通信は、達成しようとしていることに基づいて設計する必要があるものです。

他のプロセスで実行されているメソッドにアクセスするには、それらのメソッドをプロセス間通信チャネルに公開する必要があります。必要な複雑さの程度に応じて、WCF など、これを実現するために使用できるさまざまな方法があります。

C#でプロセス間通信を行う最も簡単な方法は何ですか?

編集:あなたが達成しようとしているのが(あなたが言うように)単に「実行中のプロセスのリスト」を把握することである場合、 System.Diagnostics.Process.GetProcesses() がおそらくこれを行う最良の方法です。システムからプロセス ハンドルを直接取得できます。代わりに IPC や Mutexes などの複雑なものが必要な理由がわかりません。

于 2012-12-17T19:06:00.543 に答える
0

それが良いアイデアかどうかはさておき、実際の質問に集中すると、メモリ マップ ファイルを使用してmutex、競合状態を防ぐことができます。

少し面倒ですが、実行可能です。

于 2012-12-17T18:43:55.093 に答える