複数のインスタンスを起動する必要があるプログラムがあります。
ただし、現在のインスタンスが最後のインスタンスである場合は、いくつかのアクションを実行する必要があります。
そうする方法はありますか?はいの場合、どうすればよいですか?
複数のインスタンスを起動する必要があるプログラムがあります。
ただし、現在のインスタンスが最後のインスタンスである場合は、いくつかのアクションを実行する必要があります。
そうする方法はありますか?はいの場合、どうすればよいですか?
最善の方法は、おそらく実行中のプロセスの数を数えることです
var count = System.Diagnostics.Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location)).Count();
現在のプロセスと同じ名前のプロセスのリストを取得し、それに応じて動作することができます。
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("Name.of.process.here");
if(processes.Length == 1)
if(Process.GetProcessesByName("yourprogram").Length == 0)
{
// It's the only instance!
}
ジェフリー・リッチターによる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.
}
}
}
}
他のすべての回答者はアプリケーションインスタンスを注文しないことに注意してください。
アプリケーションをどのように注文しますか?開始時間までに?その場合は、コードに分離ストレージを使用して、アプリケーションインスタンスの最後の開始日を保存し、この現在のインスタンスの開始日と比較できます(アプリケーションで静的プロパティを作成します)。参照:MSDNの記事。
アプリケーションを注文したくない場合は、Process.GetProcessesByNameを使用して、アプリケーションの名前を渡します。
デバッグモードのプロセス名はリリースモードのプロセス名とは異なることに注意してください