2011-07-25 38 views
0

我需要做一些跨進程同步。windows .net跨進程同步

只有當進程A正在運行時,進程B才應該執行一些操作。 我嘗試使用互斥和EventWaitHandles這樣的:

在處理的主要:

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

在方法B:

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

而是一個過程之後總是將開始一旦 'IsProcessARunning' 方法即使進程A關閉,也返回true。 任何想法我在這裏做錯了什麼?

+0

編碼一個小程序,嘗試重現您報告的行爲。它使用Mutex或EventWaitHandle按預期返回false。你確定流程A不再運行嗎? –

回答

0

EventWaitHandle.OpenExisting(mutexStr).WaitOne(-1,false);替換EventWaitHandle.OpenExisting(mutexStr);這樣你就可以等待事件

編輯:

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

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

必須調用eventWaitHandle.Set()開始時和eventWaitHandle.Reset()在ProcessA

回採時

EDIT2:

因爲processA可能已經崩潰,你應該impement System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(procAName);並檢查是否正在運行。如果我知道你將如何使用這個,那麼我可能會提出一個更合適的解決方案。在這種情況下,你不需要互斥。

+0

這沒有幫助,因爲在進程A啓動一次後(即使稍後關閉),IsProcessARunning始終返回true。 EventWaitHandle被髮送。 – jacob

+0

已更新後,您可能需要考慮用'WaitOne(your_max_wait,false)'替換'WaitOne(-1,false)',以便線程不會永久停留在那裏等待ProcessA – Djole

+0

「您必須調用eventWaitHandle。在啓動時設置(),在ProcessA中停止時設置eventWaitHandle.Reset()「 只有在A關閉的情況下,這可以工作,但如果它被殺死並且不能調用eventWaitHandle.Reset? – jacob