0

同じコンピューター上の複数のユーザーが使用しているこのプログラムがあります(リモートデスクトップクライアントを備えたWindows 2008サーバー環境)。

プログラムが正常に終了すると、作業ディレクトリ内の特別なファイルが削除されます。このプログラムのすべてのインスタンスにコマンドを送信して、完全にシャットダウンできるようにする必要があります (終了時にファイルを削除するため)。

これを行うための最良の方法は何ですか?各インスタンスの pid を取得することが最初だと思いますが、その後はどうでしょうか。誰にも良いアイデアはありますか?

編集:言い忘れましたが、これはWinForm(コマンドラインではない)プログラムです。

Edit2: コメントが長すぎたので、代わりに質問を編集するのが最善だと思います...

削除するファイルは、実際には pid を含むファイルです。このファイルを持つ理由は、ユーザーが同じ引数 (ログイン情報) でプログラムを 2 回起動しようとしないようにするためです。

実際にクライアント プログラムを起動しているメイン プログラム (コントロール センター) は、ユーザー ディレクトリ内の pidfile を追跡しています。ファイルを検出すると、pid を読み取り、pid が存在するかどうかを確認しようとします。そうでない場合は、実際にファイルを削除し、ユーザーがクライアント ウィンドウを起動できるようにします。

その手順を使用することで、アプリケーションに関連付けられているすべての pid を検索し、単純にそれらを強制終了できると思いますが、シャットダウン コマンドを送信できるようにしたいと考えています。理由が何であれ、プログラムはシャットダウンしています。(クライアントが開始、リモート サーバーが開始、またはこの場合は「ローカル サーバーが開始」)。

4

2 に答える 2

2

AMutexは相互排除を表すものです。この場合、それが本当にあなたが望んでいることではないと思います。それは本当にあなたが望むものをモデル化するものではありません。さらに、一度にシャットダウンできるアプリケーションは 1 つだけです。EventWaitHandle名前付きを使用して、イベント (シャットダウン イベント) を他のアプリケーションに送信する 1 つのアプリケーションをモデル化することをお勧めします。手動リセット イベントを使用する場合 (オブジェクトEventResetMode.ManualResetの作成時に使用しEventWaitHandleます。

これはバックグラウンド スレッドで行います。バックグラウンド スレッドは、シグナルが送信されると、( を介してControl.BeginInvoke) UI スレッドに何かをマーシャリングし、シャットダウンする必要があることをメイン フォームに伝えます。

于 2012-07-30T19:59:38.947 に答える
0

Mutexを使用してシステム全体のイベントを使用できます

MSDN のリンクされたページの例を参照してください

于 2012-07-30T19:36:58.903 に答える