2

一度にアプリケーションのインスタンスを 1 つだけ実行する方法を知っています: アプリケーションの別のインスタンスが実行されているかどうかを確認する方法

しかし...どうすれば、2番目のインスタンスが開始されたときに、最初のインスタンスが閉じられることを確認できますか(通常行われる2番目のインスタンスを終了するのではなく)。そして、できれば完全に閉じるのを待ってください。

2 つ以上のインスタンスが同時に開始された場合、最後のインスタンスのみが「ライブ」を許可されます。

わかりました(すべての回答に感謝します)。以下の私の解決策:

        #region Kill other running processes of this application
        List<Process> processes = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).ToList();
        if (processes.Count > 1)
        {
            processes.Sort((x, y) => DateTime.Compare(x.StartTime, y.StartTime));
            for (int i = 0; i < processes.Count - 1; i++)
            {
                processes[i].CloseMainWindow();
                processes[i].WaitForExit();
            }
        }
        #endregion

        Console.WriteLine(string.Format("{0}:{1}", DateTime.Now.Minute, DateTime.Now.Second));
        Console.ReadLine();
4

3 に答える 3

2

Microsoft.VisualBasic.dll のWindowsFormsApplicationBaseクラスを使用できます。

別のインスタンスが作成されると、最初のアプリでStartupNextInstanceイベントが発生します。この場合、現在のプロセスを強制終了できます。

 Process.GetCurrentProcess().Kill();

これにより、新しいインスタンスが有効になり、以前のインスタンスが閉じられます。

于 2012-11-12T16:29:39.913 に答える
1

プロセスとイベントの間の他の相互通信を含むこれを行うためのより良い方法があるかもしれませんが、これは研究を必要としない基本的な方法です(少なくとも私の側では)

プロセスが開始したら、ファイル(おそらくタイムスタンプ付き)を作成して、プロセスが開始されたかどうかを通知します。

元のプロセスにファイルを定期的にチェックさせ、新しいタイムスタンプが表示された場合はファイルを停止します

于 2012-11-12T16:24:49.963 に答える
1

あなたはロジックについて少し混乱していると思います。ちなみに、このようなことを行うために使用する必要があるアイテムがいくつかあります。

1- System.Diagnostics.Process.WaitForExit

特定のプロセス インスタンスに対してこのメ​​ソッドを呼び出すと、"Kill"または"Shutdown"メソッドを呼び出した後、プロセスが完全に終了するまで待機できます。Windows アプリの場合は、その過程でメイン ウィンドウを閉じます。終了するための確認ボックスがいくつかあるアプリケーションの場合、ユーザーがダイアログ ボックスを確認するかキャンセルするまで待機します (アプリケーションが既に開いているときにウィンドウがシャットダウンされる場合など)。

2- System.Diagnostics.Process.ExitCode

プロセスに送信した存在メッセージの結果にアクセスする場合は、関数を呼び出した"WaitForExit"にこのプロパティの値を呼び出す必要があります。このプロパティを使用して、最初のプロセスが終了したかどうか、および 2 番目のプロセスがどのような理由で終了したかを調べることができると思います。

3-public static int Main

プロセスの外部から終了コードにアクセスする必要があるため、"Main"メソッドの戻り値をintに変更する必要があります。このようにして、最初のプロセスで値を返し、プロパティを介して 2 番目のプロセスで値にアクセスでき"ExitCode"ます。関数で値を返すこと"Main"が難しい場合は、4 番目の項目を呼び出して終了コードを渡すことができます。

4- System.Windows.Application.Shutdown (.NET < 4 で終了)

このメソッドを呼び出すと、関数で値を返すのとまったく同じことが行われ"Main"ます。

5- System.Diagnostics.Process.GetProcessesByName

結局、この静的メソッドを呼び出すことで、指定した名前ですべてのプロセスを取得できます。

それが役に立てば幸い。すべてをできるだけ簡単に説明しようとしました。これらはすべて、ロジックを実装するために使用できるツールです。.NET が提供するこれらの機能を知っていれば、あとはとても簡単です。

結局のところ、言い忘れていましたが、もしあなたが正しいことをすることに興味があるなら、私の意見と私の経験が言うように、この種のロジックのためだけに作られたテクノロジーがあります.

6- .NET プロセス間通信または IPC (コードのサンプル) ( codeguru の紹介)

IPC は .NET リモーティング (個人的な意見では .NET で最も興味深い議論) に基づいていますが、名前が何を言っているかに関係なく、リモート通信のためだけではありません。リモート処理には多くのセクションがあり、そのうちの 1 つがプロセス間通信 (IPC) です。難しいですが、私に言わせれば最良の方法です。

乾杯

于 2012-11-12T16:36:42.143 に答える