3

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

  1. ac#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”验证了这一点,互斥体存在于“BaseNamedObjects”下作为“Mutant”类型)。为什么?我在登录时使用相同的帐户运行该服务。即使没有,这也不应该是问题,因为命名互斥锁是操作系统范围的对象,对吗?

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

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

4

2 回答 2

4

Since you want to share a mutex across sessions you must use either the Global namespace, or create your own private namespace.

As it stands, you are not specifying a namespace. And whilst the service defaults to use the global namespace, your interactive application will be using the local namespace.

于 2013-01-23T21:10:08.747 回答
-1

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

于 2017-12-01T03:24:39.613 回答