2012-05-16 16 views
5

私はマルチインスタンスアプリケーションで作業しています。どのインスタンスが現在実行されているかを知るための方法はありますか?
アプリケーション名のウィンドウプロセスをカウントするためにコードを1つ使用しましたが、それは良い方法ではありません。カウントを行うためのセマフォの実装。現在実行中のインスタンスの数

string fileName = Process.GetCurrentProcess().MainModule.FileName; 
int count = 0; 
foreach (Process p in Process.GetProcesses()) 
{ 
    try 
    { 
     if (p.MainModule.FileName == fileName) 
     { 
      count++; 
     } 
    } 
    catch { } 
} 

MessageBox.Show("Total Instances Running are " + count); 


それがセマフォまたはインスタンスが閉じたときに新しいインスタンスを1つ作成し、デクリメントされて1だけインクリメントされ、いくつかのインクリメントとデクリメントカウンタを使用して行うことができます。

答えて

1

Semaphoreはカウントダウンに役立ち、ゼロになるとブロックします。グローバルセマフォを使用できますが、十分に高い値で初期化してカウントダウンを開始する必要があります。

私はすべてあなたのソリューションがおそらく最もクリーンであると思います。

+0

回答ありがとうございます。 u plsはmsdn以外のいくつかのリソースを教えてくれますか? –

+0

Google? https://www.google.co.il/search?q=.net+semaphore&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – zmbq

+0

セマフォの問題クラスは、それを解放せずにカウントを得ることができないので、かなり面倒なコードを生成することができます。 –

1

なぜ共有メモリを使用しないのですか?もちろん、すべてのプロセスに見えるmutexで保護する必要がありますが、この方法では、一般的に使用されるデータをすべてのプロセスに保存することができます。

私はP/Invokeプラットフォームルーチンが共有メモリを作成するために必要であると思いますが、それは本当に簡単です。

1

複数のプロセスを管理することは決して問題にはなりません。 OSはそれらの間に大きな壁を張り、それは何かを硬くて高価にする。使用しているコードは例外ではありません。実行中のプロセスを反復することは費用がかかります。最初にスレッドを使用することを常に検討し、.NETプログラムでAppDomainsを探します。これは、プロセスが提供できる分離の種類を提供するために明示的に発明された機能ですが、interop barrierを犠牲にするコストはありません。

マルチプロセスソリューションをお約束する場合、ほとんどの場合、アービターとして機能する別個のプロセスがほとんど常に必要です。ワーカープロセスの開始を保証し、未処理の例外でそれらの1つが死んだ場合に意味のある処理を実行する責任があります。それは、それが死亡した理由についての情報を得るための良い方法がなく、あなたは膨大な量の状態を失ったため、対処するのが非常に難しいものです。典型的な結果は、これらのプロセスにあなたが簡単に行うことができない非常に簡単なことを与えない限り、アプリケーション全体の誤動作です。

このようなアービタープロセスは、インスタンスを安価にカウントする問題がなく、Process.Exitedイベントを使用してカウンタを維持できます。ポーリングする代わりにイベント。

関連する問題