9

プログラムの複数のインスタンスを同時に実行している可能性がある状況がありますが、これらのインスタンスの複数で一度に 1 つの特定の関数だけを実行しないことが重要です。

これは、ミューテックスを使用してこれが起こらないようにする適切な方法ですか?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
4

2 に答える 2

18

1つのアプリケーションの複数のインスタンスについておっしゃっていたので、2つのprogram.exeが実行されているということですよね?lockステートメントは、プログラム内だけで、複数のプログラム間でロックすることはありません。真のMutexが必要な場合は、System.Threading.Mutexオブジェクトを確認してください。

使用例は次のとおりです。

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

createdNew変数は、それが最初に作成されたかどうかを通知します。ただし、作成されているかどうかのみが通知されます。ロックを取得する場合は、WaitOneを呼び出してから、ReleaseMutexを呼び出してロックを解除する必要があります。ミューテックスを作成したかどうかを確認したいだけの場合は、それを作成するだけで問題ありません。

于 2008-09-05T21:38:56.950 に答える
5

シーカーは正しいです。

ロックに関するClrViaC # (p638-9)でのJeff Richterのアドバイスは、特にロックを目的としたプライベートオブジェクトを作成することです。

private Object _lock = new Object();

// usage
lock( _lock )
{
    // thread-safe code here..
}

これが機能するのは、現在のクラスの外部では_lockをロックできないためです。

編集:これは、単一のプロセス内で実行されているスレッドに適用されます。@David Mohundroの答えは、プロセス間ロックに対して正しいです。

于 2008-09-05T21:27:30.597 に答える