跨用户C#互斥体

我的应用程序被迫使用第三方模块,如果在同一台机器上同时启动两个实例,它将蓝屏Windows。 要解决此问题,我的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。

我该如何解决这个问题?

使用“Global \”前缀互斥锁的名称。 来自http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx :

如果其名称以前缀“Global \”开头,则互斥锁在所有终端服务器会话中都可见。 如果其名称以前缀“Local \”开头,则互斥锁仅在创建它的终端服务器会话中可见。 在这种情况下,服务器上的每个其他终端服务器会话中可以存在具有相同名称的单独互斥锁。 如果在创建命名互斥锁时未指定前缀,则它将使用前缀“Local \”。

将互斥锁名称更改为以Global\开头。

资源

在运行终端服务的服务器上,命名系统互斥锁可以具有两个级别的可见性。 如果其名称以前缀“Global \”开头,则互斥锁在所有终端服务器会话中都可见。 如果其名称以前缀“Local \”开头,则互斥锁仅在创建它的终端服务器会话中可见。 在这种情况下,服务器上的每个其他终端服务器会话中可以存在具有相同名称的单独互斥锁。 如果在创建命名互斥锁时未指定前缀,则它将使用前缀“Local \”。 在终端服务器会话中,名称仅由其前缀不同的两个互斥锁是独立的互斥锁,并且两者对终端服务器会话中的所有进程都可见。 也就是说,前缀名称“Global”和“Local \”描述互斥体名称相对于终端服务器会话的范围,而不是相对于进程的范围。