1

複数のインスタンスを起動する必要があるプログラムがあります。

ただし、現在のインスタンスが最後のインスタンスである場合は、いくつかのアクションを実行する必要があります。

そうする方法はありますか?はいの場合、どうすればよいですか?

4

5 に答える 5

2

最善の方法は、おそらく実行中のプロセスの数を数えることです

var count = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count();
于 2012-11-22T11:08:27.347 に答える
2

現在のプロセスと同じ名前のプロセスのリストを取得し、それに応じて動作することができます。

System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("Name.of.process.here");
if(processes.Length == 1)
于 2012-11-22T11:08:29.260 に答える
2
if(Process.GetProcessesByName("yourprogram").Length == 0)
{
    // It's the only instance!
}
于 2012-11-22T11:09:47.407 に答える
0

ジェフリー・リッチターによるC#本によるCLRではSemaphore、これにクラスを使用する例でした。

using System;
using System.Threading; 

public static class Program {
    public static void Main() {
        bool created; 

        using(new Semaphore(0, 1, "SomeUniqueStringIdentifyingMyApp", out created)) {
            if(created) {
                //This thread created kernel object so no other instance of this app must be running
            } else {
                //This thread opens existing kernel object with the same string name which means 
                //that another instance of this app must be running. 
            }
        }
    }
}
于 2012-11-22T11:16:47.640 に答える
0

他のすべての回答者はアプリケーションインスタンスを注文しないことに注意してください。

アプリケーションをどのように注文しますか?開始時間までに?その場合は、コードに分離ストレージを使用して、アプリケーションインスタンスの最後の開始日を保存し、この現在のインスタンスの開始日と比較できます(アプリケーションで静的プロパティを作成します)。参照:MSDNの記事

アプリケーションを注文したくない場合は、Process.GetProcessesByNameを使用して、アプリケーションの名前を渡します。

デバッグモードのプロセス名はリリースモードのプロセス名とは異なることに注意してください

于 2012-11-22T11:19:56.270 に答える