2010-05-13 115 views
19

我的應用程序被迫使用第三方模塊,如果兩個實例在同一臺機器上同時啓動,它將藍屏Windows。要解決這個問題,我的C#應用​​程序有一個互斥體:跨用戶C#互斥體

static Mutex mutex = new Mutex(true, "{MyApp_b9d19f99-b83e-4755-9b11-d204dbd6d096}"); 

我檢查它是否存在 - 如果是這樣我顯示錯誤消息,並關閉應用程序:

bool IsAnotherInstanceRunning() 
    { 
     if (mutex.WaitOne(TimeSpan.Zero, true)) 
      return (true); 
     else 
      return (false); 
    } 

的問題是如果兩個用戶可以同時登錄並打開該應用程序,並且IsAnotherInstanceRunning()將返回false。

我該如何解決這個問題?

+1

如何在第三方模塊做到這一點?你有聯繫他們的支持嗎? – SLaks 2010-05-13 21:46:38

+0

除非它是一個內核級驅動程序,這是令人驚訝的困難,以使Windows藍屏這些日子 - 什麼在世界上是模塊是在做什麼? – 2010-05-13 21:52:27

+0

@BlueRaja:從用戶模式藍屏Windows很容易。你有沒有試過殺死csrss.exe? – 2010-05-13 21:57:19

回答

30

在「Global \」前加上互斥體的名稱。從http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

如果其名稱的前綴 「全球\」開始,互斥量在所有 終端服務器會話可見。如果其名稱 以前綴「Local \」開頭,則 互斥量僅在其創建的終端 服務器會話中可見。 在這種情況下,與 單獨互斥相同的名稱可以在每個 服務器上的其他 終端服務器會話的存在。如果您在創建命名互斥體時未指定前綴 ,則其 將採用前綴「Local \」。

13

將互斥鎖名稱更改爲以Global\開頭。

Source

在運行終端 服務的服務器,命名系統互斥可以 有知名度的兩個層次。如果其 名稱以前綴「Global」, 開頭,則所有終端 服務器會話中都會顯示互斥鎖。如果其名稱以前綴「Local \」開頭 ,則互斥量爲 僅在創建它的終端服務器會話 中可見。在該情況下, 服務器上的其他每個 終端服務器會話中都可能存在具有相同 名稱的單獨互斥。如果您在創建命名互斥體時未指定前綴 ,則其 將採用前綴「Local \」。在一個 終端服務器會話中,兩個互斥 的名字只被他們 前綴不同,是獨立的互斥和 都是在 終端服務器會話中的所有進程可見。即, 前綴名稱「Global \」和 「Local \」描述了 互斥體名稱相對於終端服務器 會話的範圍,與過程無關。