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

标签 c# .net mutex

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

  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. 随着服务的运行,应用会抛出 WaitHandleCannotBeOpenedException,这意味着它看不到存在的互斥锁(我使用工具“WinObj”对此进行了验证,互斥锁以“Mutant”类型存在于“BaseNamedObjects”下)。为什么?我在登录时使用同一帐户运行该服务。即使没有,这也不应该是问题,因为命名互斥体是操作系统范围的对象,对吗?

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

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

最佳答案

因为你想在 session 之间共享一个互斥体,你必须使用Global命名空间,或者创建你的own private namespace .

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

关于c# - 无法识别命名的系统互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14488481/

相关文章:

.net - 阅读有关DDD的内容后,您现在正在使用哪些做法?

c - 在 linux C 中使用 Pthread 进行数组分区

c# - XML 模式不适用于 Web 服务软件工厂

c# - Tls 1.2 或 Tls 1.0 与 .net 框架 4.0

c# - 在 .NET 中使用 Thread.Abort() 和处理 ThreadAbortException 是否安全?

c - 使用 pthreads 的简单流水线

c++ - 使用互斥锁作为信号量?

c# - 将控制字符 (\x1f) 与字符串和/或 StringBuilder 一起使用

c# - .NET 4.5 中的异步服务外观

c# - 在 .Net CORE 1.0 中解压缩存档