我正在尝试使用公开记录的互斥体来检测 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 就会开始正常继续。
我的程序有明显的逻辑错误吗?
我尝试了以下操作:
编辑
这样,我看到了与 EzCad 相同的行为,即我的主程序没有响应(无法成功执行 WaitOne(0) - 因此无法回收互斥体),即使我执行了 ReleaseMutex在我的模拟助手上。
如果我杀死助手,我的主软件将恢复正常,就像 EzCad 一样。 所以我很确定“ReleaseMutex”方法的执行或使用是错误的,即使它的执行没有抛出异常。
您的问题可能出在
Thread.Sleep(50);
如果这样做,整个线程将休眠。不仅仅是执行上下文! EzCAD 很可能在同一线程上运行。所以它在你睡眠期间不会得到任何执行时间。在这种情况下,您的应用程序“始终”声明互斥锁。
尝试Task.Sleep()。您可能想使用异步和等待。