2011-07-25 11 views
0

いくつかのクロスプロセス同期を行う必要があります。windows .netクロスプロセス同期

プロセスBは、プロセスAが実行されている場合にのみ、いくつかのアクションを実行する必要があります。 私はこのようなミューテックスとEventWaitHandlesを使用してみました:常にます

private static bool IsProcessARunning(string mutexStr) 
{ 
    try 
    { 
     EventWaitHandle.OpenExisting(mutexStr); 
     return true; 
    } 
    catch (WaitHandleCannotBeOpenedException e) 
    { 
     return false; 
    } 
} 

しかし、処理後にA 'はIsProcessARunning' メソッドいったん開始します。プロセスで

メイン:プロセスBでは

EventWaitHandle eventWaitHandle = new EventWaitHandle(true, EventResetMode.ManualReset, "SOMEGUID"); 

プロセスAが閉じていてもtrueを返します。 私はここで何が間違っているのでしょうか?あなたが開始するときeventWaitHandle.Set()を呼び出す必要がありますEventWaitHandle eventWaitHandle = new EventWaitHandle(true, EventResetMode.ManualReset, "SOMEGUID");

EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, "SOMEGUID");

にと:

変更:あなたがイベントに

EDIT待つことができるように

+0

報告した動作を再現しようとする小さなプログラムをコード化しました。 MutexまたはEventWaitHandleを使用して、期待通りに私にfalseを返します。あなたはプロセスAがもう稼働していないと確信していますか? –

答えて

0

EventWaitHandle.OpenExisting(mutexStr).WaitOne(-1,false);EventWaitHandle.OpenExisting(mutexStr);を置き換えますeventWaitHandle.Reset() ProcessAに

EDIT2ストーピング:processAはあなたが System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(procAName);をimpementし、それが実行されているかどうかを確認する必要がありクラッシュしている場合がありますので

を。これを正確にどのように使用するのか分かっていれば、より適切な解決方法を提案することができます。この場合、ミューテックスは必要ありません。

+0

プロセスAを一度起動した後(後で終了した場合でも)、IsProcessARunningは常にtrueを返すので、これは役に立ちません。 EventWaitHandleが通知されます。 – jacob

+0

が更新されました。また、WaitOne(-1、false)をWaitOne(your_max_wait、false)に置き換えて、スレッドがProcessAを待つことなく永久に停止しないようにすることもできます。 – Djole

+0

"eventWaitHandleを呼び出さなければなりません。 ProcessAで停止するときにset()を開始し、ProcessWaitHandle.Reset()を呼び出す " これはAが閉じている場合にのみ機能しますが、killされてeventWaitHandle.Resetを呼び出せない場合はどうなりますか? – jacob

関連する問題