1

更新プログラムをインストールするために、プロジェクトで相互排除を保証したいと考えています。
プロジェクトはマルチインスタンスであるため、開いている他のインスタンスを閉じずにインスタンスを開くことができます。installUpdates()利用可能なアップデートをインストールするという関数があります。複数のインスタンスが存在するため、アップデートをインストールする必要があるのはそのうちの 1 つだけです。1 つのインスタンスのみが更新プログラムをインストールするようにしたいと考えています。に初期化された(セマフォ)
と呼ばれる変数をグローバルに取得しています。新しいインスタンスが開かれると、変数は 1 ずつ増加します。4 つの開いているインスタンスがある場合、値は4 になります。インスタンスが閉じられると、値は 1 減ります。私が書いているアップデートをインストールするために:-noOfInstances0noOfInstances

if(noOfInstances == 1)
{
   InstallUpdates();
}

今私の問題は、プロジェクトのインスタンスが開かれていることをプログラムで追跡する方法ですか? 私が識別できないインスタンスごとに一意の ID がある場合があります。Windows 環境を使用して C# アプリケーションを開発しています。

4

4 に答える 4

2

グローバル Mutex は、1 回限りの関数へのアクセスを制限するより優れたメカニズムです。この例では、短いタイムアウトでミューテックスを取得しようとします。あなたがそれを取得できなかった場合 - 他の誰かがそれを持っています。成功した場合は、更新が必要かどうかをテストし、必要な場合は更新をインストールします。

最適化は、テストをミューテックスの外に移動することかもしれませんが、ミューテックスのスコープ内で更新が必要な場合は、再テストする必要があります。

C# でグローバル ミューテックスを使用するための適切なパターンは何ですか?

于 2012-05-16T06:16:44.257 に答える
0

次のように実行中のプロセスを取得できます。

using System.Diagnostics;

int GetInstanceCount(ExeName)
{
    Process[] processlist = Process.GetProcessesByName(ExeName);
    int NoOfInstances = processlist.Count;
    return NoOfInstances;
}

次のように実装します。

string ExeName = "notepad.exe"//Say Notepad
if(GetInstanceCount(ExeName) == 1)
{
   InstallUpdates();
}
于 2012-05-16T06:16:24.970 に答える
0

Process.GetProcessesを使用して、名前でプロセスを取得できます

var processes = Process.GetProcesses Method (ProcessName)
if (processes!= null)
{
  int runningInstances = processes.Length;
}
于 2012-05-16T06:16:36.707 に答える
0

私は過去に @stephbu のミューテックス パターンを実装しましたが、最近の要件は、プログラムが 2 回起動された場合に実行中のインスタンスを前面に移動する必要があるというものでした。

そのために、名前付きパイプへの接続を試みます。接続できない場合は、これが最初のインスタンスであり、名前付きパイプを作成してから通常どおりに処理します。接続できる場合、これは 2 番目のインスタンスであり、パイプ経由でコマンドを送信して終了します。

名前付きパイプでコマンドを受け取ると、メイン ウィンドウを一番上に移動するなど、何でもできます。

ただし、この解決策は、上記のように実際にパイプで何かをしたい場合にのみ意味があります。アプリケーションが 2 回実行されるのを防ぎたいだけの場合は、@stephbu のミューテックスの回答が最適です。

于 2012-05-16T06:30:59.160 に答える