C# Mutex 未发布? EZCAD2MUTEX_MARKING

问题描述 投票:0回答:1

我正在尝试使用公开记录的互斥体来检测 EzCad2 软件当前是否处于激光标记(互斥体锁定/发出信号)或空闲状态(互斥体释放/未发出信号)。根据文档,这种方法是理想的并且是可能的。

以下是摘录:

“选项启用标记互斥体(EZCAD2MUTEX_MARKING): 该选项用于将Ezcad程序与第三方程序同步。如果选中,Ezcad 软件将创建一个名为“EZCAD2MUTEX_MARKING”的互斥对象。在互斥锁被其他程序“发出信号”之前,标记命令无法执行。标记后,互斥锁将被 Ezcad 软件切换为“无信号”状态。”

我想用以下代码来实现这一点:

    private void Foo()
    {
        Mutex tmpMutex = null;

        try
        {
            string mutexname = "EZCAD2MUTEX_MARKING";
    
            if(!Mutex.TryOpenExisting(mutexname, out tmpMutex))
            {
                tmpMutex = new Mutex(true, mutexname, out bool createdNew);
            }
    
            while(true)
            {
                if(tmpMutex.WaitOne(1)) // Ezcad not marking
                {
                    Console.Write("mutex free"); 
    
                    tmpMutex.ReleaseMutex(); // EzCad could mark after release
    
                    Console.WriteLine(" + released successfully"); 
                }
                else
                {
                    Console.WriteLine("mutex blocked"); // EzCad is Marking
                }
    
                Thread.Sleep(50); // Wait for a Bit before next round
            }
    
        }
        catch
        {
            throw;
        }
        finally
        {
            if(tmpMutex != null)
            {
                tmpMutex.Wait();
                tmpMutex.ReleaseMutex();
                tmpMutex.Close();
                tmpMutex.Dispose();
            }
        }
    }

由于无法解释且不可重现的原因,EzCad 在多次迭代后停止响应。我的程序保留在“互斥自由”分支中。要么互斥锁没有被

tmpMutex.ReleaseMutex()
释放,要么 EzCad 不再使用互斥锁。

现在我认为我的代码中存在逻辑错误: 如果我的软件仍在运行,EzCad 将永远保持该状态。一旦我终止我的软件,EzCad 就会开始正常继续。

我的程序有明显的逻辑错误吗?

我尝试了以下操作:

  • 释放互斥体后关闭+处理它
  • 使用 tmpMutex.WaitOne(0) > 应该是非阻塞的并且不声明互斥体
  • 使用 tmpMutex.WaitOne(1) > 如果空闲则应声明互斥锁(如果在超时到期之前变为空闲)
  • 循环内的不同时间+延迟

编辑

  • 用我自己的(声明和释放功能)模拟EzCad:

这样,我看到了与 EzCad 相同的行为,即我的主程序没有响应(无法成功执行 WaitOne(0) - 因此无法回收互斥体),即使我执行了 ReleaseMutex在我的模拟助手上。

如果我杀死助手,我的主软件将恢复正常,就像 EzCad 一样。 所以我很确定“ReleaseMutex”方法的执行或使用是错误的,即使它的执行没有抛出异常。

c# locking mutex
1个回答
0
投票

您的问题可能出在

Thread.Sleep(50);

如果这样做,整个线程将休眠。不仅仅是执行上下文! EzCAD 很可能在同一线程上运行。所以它在你睡眠期间不会得到任何执行时间。在这种情况下,您的应用程序“始终”声明互斥锁。

尝试Task.Sleep()。您可能想使用异步和等待。

© www.soinside.com 2019 - 2024. All rights reserved.