5

私はマルチインスタンスアプリケーションに取り組んでいます。c# で、現在実行中のインスタンスの数を知る方法はありますか?
アプリケーション名のウィンドウ プロセスをカウントするために 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 ずつ減少するインクリメントおよびデクリメント カウンターを使用して実行できますか。

4

3 に答える 3

1

複数のプロセスを管理することは決して問題ではありません。OSはそれらの間に大きな壁を作り、それがハードで高価なものになります。使用しているコードも例外ではなく、実行中のプロセスを繰り返すにはコストがかかります。常に最初にスレッドの使用を検討し、.NETプログラムでAppDomainsを探します。これは、プロセスが提供できる種類の分離を提供するために明示的に発明された機能ですが、相互運用性の障壁を取り除くコストはかかりません。

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

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

于 2012-05-16T13:07:38.810 に答える
1

なぜ共有メモリを使わないのですか?もちろん、すべてのプロセスから見えるミューテックスで保護する必要がありますが、このようにして、すべてのプロセスで共通に使用されるデータを保存できます。

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

于 2012-05-16T12:13:26.070 に答える
1

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

全体として、独自のソリューションがおそらく最もクリーンだと思います。

于 2012-05-16T05:21:09.257 に答える