2011-10-06 37 views
2

我的程序作爲服務或控制檯運行。我創建了一個System.Threading.Mutex來啓動這兩種模式中的一種。這裏我的代碼帶有服務和控制檯的System.Threading.Mutex

public class MyServer 
{ 
// Private variable 
System.Threading.Mutex serverMutex; 

public MyServer() 
{ 
    bool createdNew; 
    ServerMutex = new System.Threading.Mutex(true, "MyServerMutex", out createdNew); 
    if (!createdNew) 
    { 
     throw new Exception("Another server instance is running"); 
    } 
} 
} 

首先從控制檯開始,然後從另一個控制檯開始引發異常。 首先從服務開始,控制檯不會拋出異常。首先開始控制檯,然後服務是相同的。

任何想法? 我想知道,因爲我認爲,它已經在幾個月前開始工作,當我實現該功能時。

我正在使用.NET 4.0。

感謝, 弗雷迪

回答

7

問題可能是因爲你的服務在不同憑證運行,所以互斥是不是「共享」用戶/會話之間...
你必須前綴"Global\"互斥體的名稱
看看這個good post

+0

感謝馬可,竟然是我搜索了;) – Freddy

+0

我不得不等待6分鐘... ... ;) – Freddy

3

正如Marco說你應該互斥喜歡的東西被命名爲:

string.Format(@"Global\{0}", mutexName); 

出現在全局命名空間(給所有登錄的用戶可見)。如果你需要操作一次,通過服務創建互斥體,你還需要指定誰可以操縱它:

var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null); 

var security = new MutexSecurity(); 
security.AddAccessRule(new MutexAccessRule(users, MutexRights.Synchronize, AccessControlType.Allow)); 
security.AddAccessRule(new MutexAccessRule(users, MutexRights.Modify, AccessControlType.Allow)); 

new Mutex(false, name, out createdNew, security); 
+0

好帖子,爲你+1! – Marco