与服务和控制台的互斥
本文关键字:控制台 服务 | 更新日期: 2023-09-27 18:10:46
我的程序作为服务或控制台运行。我已经创建了一个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。
谢谢,弗雷迪
问题可能是因为你的服务在不同的凭据下运行,所以互斥锁不能在用户/会话之间"共享"…
你必须在互斥对象的名字前加上"Global'"
正如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);