1

サーバーに配置されるC#でアプリケーションを作成しました。誰かがそれを使用する必要がある場合、アプリケーションはサーバーから、LAN に接続された任意の PC から直接起動されます。

実行中のインスタンスの数を確認する簡単な方法はありますか? というか、私が起動したインスタンス以外のインスタンスがある場合は?


編集:

これは提供された投稿の複製ではありません。実行中のインスタンスが 1 つだけであることを確認したくないため (「同時に複数のアプリを実行しないでください」のように)、確認するだけです。私以外の誰かがそれを実行しています (通常の状況では、複数の PC で同時に動作する必要があります)。

4

3 に答える 3

1

プログラムのインスタンスが同じバイナリの一部のマシンで実行されていることを知る簡単な方法はありません。プログラムは、実行中の他のインスタンスがあるかどうかを確認できる共有場所に「実行中」と報告する必要があります。

単一のインスタンスのみを確認する必要がある場合は、同じ場所からファイルを開くことができる可能性があり、複数のインスタンスがそのファイルを開こうとすると失敗します。

インスタンスをカウントするための共有場所のオプションを組み合わせます。

  • マシンの名前でいくつかのファイルを更新します
  • ping を実行する Web サービス/サイト
  • 共有DB

また、プログラムが終了した場合、この特定のインスタンスが終了したという報告が共有場所にない可能性があることも意味することに注意してください。

于 2013-04-24T19:16:50.040 に答える
0

ソケットやデータベースを使用するなど、いくつかの方法があります。最も簡単な方法 (安全ではありません) は、ファイルを使用してインスタンスの数を記録することです。これを改善することをお勧めします。

void WriteToFile(int x, int millisecondsTimeout) {
    for(; ; Thread.Sleep(millisecondsTimeout))
        try {
            using(var file=File.Open("instances.bin", FileMode.OpenOrCreate)) {
                var bytes=new byte[sizeof(int)];
                file.Read(bytes, 0, sizeof(int));
                var instances=x+BitConverter.ToInt32(bytes, 0);

                if(instances>-1)
                    file.Write(BitConverter.GetBytes(instances), 0, sizeof(int));

                break;
            }
        }
        catch(IOException ex) {
        }
}

void Increment() { // invoke on program starts
    WriteToFile(1, 1000);
}

void Decrement() { // invoke on program exits
    WriteToFile(-1, 1000);
}

ファイル"instances.bin"は、サーバー上にあるファイルである必要があります。

AppDomain.CurrentDomain.UnhandledExceptionプログラムが予期せず終了した場合は、ハンドラーを作成することもできます。

于 2013-04-24T18:53:08.500 に答える