C#互斥总是卡在WaitOne上

C#互斥总是卡在WaitOne上,c#,mutex,C#,Mutex,我有一个进程,它创建互斥体并立即获得所有权,然后单击一个按钮,它就会释放它: Mutex req_mutex = new Mutex(true, "req_mutex"); 另一个过程是循环并检查互斥体是否存在,当它存在时,它会等待释放互斥体: bool waitingForReqMutexCreation = true; while (waitingForReqMutexCreation) { try { req_mutex = Mutex.O

我有一个进程,它创建互斥体并立即获得所有权,然后单击一个按钮,它就会释放它:

Mutex req_mutex = new Mutex(true, "req_mutex");

另一个过程是循环并检查互斥体是否存在,当它存在时,它会等待释放互斥体:

bool waitingForReqMutexCreation = true;
while (waitingForReqMutexCreation)
{
      try
      {
           req_mutex = Mutex.OpenExisting("req_mutex", MutexRights.Synchronize);
           waitingForReqMutexCreation = false;
      }
      catch (WaitHandleCannotBeOpenedException)
      {
           Thread.Sleep(1000);
      }
}

问题是,即使在第一个过程中按钮应该释放互斥锁之后,WaitOne也不会继续


有人知道为什么会这样吗?

我想我找到了我自己问题的答案

显然,你做的WaitOne操作的数量很重要。 我获得了所有权(构造函数中的true参数),并在同一线程中进行了额外的WaitOne,假设它不会造成伤害。 现在为了释放互斥锁,我显然不得不调用ReleaseMutex两次


我想我仍然可以这样做,并在循环中调用ReleaseMutex,直到抛出异常…

我认为如果您使用true(
new mutex(true,“req_mutex”);
创建互斥体 因此,您不需要在该过程中调用
WaitOne()

文档中说,在调用此构造函数重载时,最好为initiallyOwned指定false


编辑:啊,你赢了我:)…

在你的第一个应用程序中,你基本上获得了两次互斥。您可以通过在第二个应用程序运行时终止第一个应用程序来看到这一点,您将得到一个
放弃的MutexException
(这意味着获取互斥锁)。通过以下方式复制,readline代替了按钮点击:

namespace Mutex\u 1
{
班级计划
{
静态void Main(字符串[]参数)
{
Mutex req_Mutex=新的互斥(true,“req_Mutex”);
String t=String.Empty;
而(!t.Contains(“q”))
{
Console.WriteLine(“输入:”);
t=Console.ReadLine();
控制台写入线(“等待请求互斥”);
req_mutex.WaitOne();//第一次单击不需要
控制台写入线(“释放请求互斥”);
req_mutex.ReleaseMutex();
}
Console.ReadLine();
}
}
}
名称空间互斥2
{
班级计划
{
静态void Main(字符串[]参数)
{
Mutex req_Mutex=null;
bool waitingForReqMutexCreation=true;
while(等待ReqMutexCreation)
{
尝试
{
req_mutex=mutex.OpenExisting(“req_mutex”);
waitingForReqMutexCreation=false;
}
捕获(WaitHandleCannotBeOpenedException)
{
WriteLine(“请求互斥不存在”);
睡眠(1000);
}
}
Console.WriteLine(“找到请求互斥”);
req_mutex.WaitOne();//等待新请求这里有问题*********
Console.WriteLine(“在请求互斥后。WaitOne()”;
req_mutex.ReleaseMutex();//释放req mutex以获得更多请求
Console.ReadLine();
}
}
}
这句话的更多证据是:在父级中调用两次
ReleaseMutex
,第一次“单击”就会成功(第二次就会崩溃)。通过在创建锁时不获取锁,可以在不引发异常的情况下修复此问题:

Mutex req_mutex = new Mutex(false, "req_mutex");

不要在循环中调用ReleaseMutex。如果您不能确切地知道应该释放互斥锁的时间,那么您的应用程序设计得很糟糕。在您的情况下,正如其他人所指出的,互斥最初不应该是自己的。或者,您应该在初始化完成后释放它。无论如何,你现在应该知道你在做什么。多线程不是你可以猜测的东西。如果您做错了,您的应用程序将无法始终按预期工作。
req_mutex.WaitOne(); // wait for new request   *********** problem here *********
req_mem.readFile(); // read request
req_mutex.ReleaseMutex(); // release req mutex for more requests
Mutex req_mutex = new Mutex(false, "req_mutex");