跨用户C#互斥

War*_*pin 23 c# mutex

我的应用程序被迫使用第三方模块,如果在同一台机器上同时启动两个实例,它将蓝屏Windows.要解决此问题,我的C#应用​​程序有一个互斥锁:

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

我检查它是否存在 - 如果是这样我显示错误消息并关闭应用程序:

    bool IsAnotherInstanceRunning()
    {
        if (mutex.WaitOne(TimeSpan.Zero, true))
            return (true);
        else
            return (false);
    }
Run Code Online (Sandbox Code Playgroud)

问题是如果两个用户可以同时登录并打开应用程序,IsAnotherInstanceRunning()将返回false.

我该如何解决这个问题?

Pau*_* pk 37

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

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


SLa*_*aks 13

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

资源

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