ミューテックスを使用してアプリケーションを一度に1つのインスタンスだけを実行するように制限する方法を理解しています。しかし、私のアプリケーションでは、複数のインスタンスを同時に実行することができますが、実行可能ファイルの名前が変更されているかどうかに関係なく、特定のユーザーの実行中のインスタンスをすべてカウントしたりリストする方法が必要です。ここでミューテックスを使用することができますか、これを行うことができるプロセスクラスですか?私は、名前でプロセスをリストするプロセスクラスを使用する方法を知っていますが、EXEがユーザーによって名前が変更された場合はどうなりますか?これはどのようにして最善の扱いですか特定のユーザーログオンで実行されている1つのプロセスのすべてのインスタンスを数える最善の方法は何ですか?
EDIT:私の目的のために、同じアプリケーションの他のインスタンスを数え上げるのではなく、数えられるだけで十分であることが判明しました。それらを数えるために、私は名前付きセマフォーを使用しました。
//.Release() will exit the semaphore and increment the semaphore count, but it will also return the value of the count just before .Release() was called, which is what we really need here.
int numberOfRunningInstances = 10000 - mySemaphore.Release();
//Then we can simply use .WaitOne() to re-enter the semaphore and decrement the count back to what it was before calling .Release()
mySemaphore.WaitOne();
を次にとき:アプリケーションの実行中の各インスタンスは、1で私が使用することができます実行している私は、アプリケーションのどのように多くのインスタンスをチェックする必要があり、その後の任意の時間をカウントがデクリメントされますので
//Initialize the semaphore with an initial value of 10000 and a maximum value of 10000. The 'Global\' prefix will be system wide. Remove it to limit the semaphore to the current logon session
Semaphore mySemaphore = new Semaphore(10000, 10000, @"Global\mySemaphoreUniqueNameGoesHere");
//Call .WaitOne() to enter the semaphore and decrement the semaphore count
mySemaphore.WaitOne();
アプリケーション終了:
//call .Release() to exit the semaphore and increment the count
mySemaphore.Release()
明確にするには:1.exe、2.exe、および3.exeを持っていても、同じexeのすべてが同一のコピーである場合のみ、別の名前に変更されています。同じアプリケーションの名前が同じでない場合 –
共有メモリ(Windows用語ではファイルマッピングですが、実際のファイルは必要ありません)を使用して、各プロセスに独自のプロセスIDをリストに追加させることができます。 –