无法识别命名的系统互斥锁

本文关键字:系统 识别 | 更新日期: 2023-09-27 17:55:23

我正在尝试命名系统互斥体方法来同步两个进程-

  1. 一个 C# Windows 服务
  2. 桌面 C# 应用
创建互斥锁

时,未创建互斥锁的进程似乎不会检测到现有互斥锁。下面更详细:

Windows服务负责创建互斥锁(无前缀-全局/本地等。只是一个普通的命名系统互斥锁),如下所示:

        Mutex myMutex= null;
        try
        {
            myMutex= Mutex.OpenExisting(myMutexName);
        }
        catch (WaitHandleCannotBeOpenedException x)
        {
            //doesn't exist. 
            try
            {
                this.GetLogger().Info("Create Mutex");
                bool createdNew = false;
                new Mutex(false, myMutexName, out createdNew);
                if (!createdNew) throw new Exception("Unable to create Mutex");
            }
            catch (Exception ex)
            {
                this.Stop();
            }
        }
        catch (Exception x)
        {
            this.Stop();
        }
        finally
        {
            if (myMutex!= null)
            {
                try
                {
                    myMutex.ReleaseMutex();
                }
                catch(Exception x)
                {
                    this.GetLogger().Warn("Unable to release mutex");
                }
            }
        }

我在onStart()中有这个。此外,在服务中的其他地方,我在此互斥锁上同步。

现在,在应用程序中,我这样使用它:

            Mutex myMutex= null;
        try
        {
            myMutex= Mutex.OpenExisting(this.myMutexName);
            myMutex.WaitOne();
//do required stuff

        }
        catch (WaitHandleCannotBeOpenedException wcbox)
        {
            //doesn't exist yet. service not running??
            this.GetLogger().Error("Background Service is not Running");
            shutdownApp();
        }
        finally
        {
            if (myMutex!= null)
            {
                try
                {
                    myMutex.ReleaseMutex();
                }
                catch (Exception x)
                {
                }
            }
        }

我的问题:

  1. 在服务正在运行的情况下,应用程序会抛出 WaitHandleCannotBeOpenException,这意味着它看不到存在的互斥锁(我使用工具"WinObj"验证了这一点,互斥锁存在于"BaseNamedObjects"下作为类型"突变")。为什么?我在登录时使用相同的帐户运行该服务。即使没有,这也不应该是问题,因为命名互斥锁是操作系统范围的对象,对吗?

  2. 我不太清楚互斥锁何时会被销毁。目前,我看到在启动服务时创建了互斥锁,当我停止服务时,我看到互斥锁不再存在(WinObj)。这是否意味着当没有人等待互斥锁以及创建者进程结束时,互斥锁会被垃圾回收?

  3. 通常,命名系统互斥锁的生命周期是什么。具体来说,它什么时候死?

无法识别命名的系统互斥锁

由于您希望在会话之间共享互斥锁,因此必须使用 Global 命名空间或创建自己的私有命名空间。

就目前而言,您没有指定命名空间。虽然服务默认使用全局命名空间,但交互式应用程序将使用本地命名空间。

@david 我使用一个名为Google的工具可以轻松找到它,并且我们正在生产中运行,并通过交互式服务启用交互式服务检测。 除非切换该注册表项,否则无法启动交互式服务检测。 我不知道这里的争论是什么:它在那里,它有记录,谷歌可以很容易地指出你。