C#向新手解释互斥时间跨度

C#向新手解释互斥时间跨度,c#,multithreading,mutex,C#,Multithreading,Mutex,我对互斥是完全陌生的 我不明白这意味着什么: WaitOne(TimeSpan)阻塞当前线程,直到当前实例 接收信号,使用时间跨度指定时间间隔。 (继承自WaitHandle。) 例如,如果我使用: static void Main() { using(Mutex mutex = new Mutex(false, appGuid)) { if(!mutex.WaitOne(2000, false)) { MessageBox.Show("I

我对互斥是完全陌生的

我不明白这意味着什么:

WaitOne(TimeSpan)阻塞当前线程,直到当前实例 接收信号,使用时间跨度指定时间间隔。 (继承自WaitHandle。)

例如,如果我使用:

static void Main() 
{
   using(Mutex mutex = new Mutex(false, appGuid))
   {
      if(!mutex.WaitOne(2000, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

      GC.Collect();                
      Application.Run(new Form1());
   }
}
这是否意味着一旦

if(!mutex.WaitOne(2000, false))
如果触发,它将等待2秒钟,然后检查线程上是否有锁

这意味着当前线程将阻塞,直到有人调用
mutex.ReleaseMutex()
或超过2000ms超时。如果达到超时,操作将返回
false

有关方法调用的更多详细信息,请参见MSDN链接


因此,底线是不管您传递什么值作为超时,调用
mutex.ReleaseMutex()
无论如何都会立即释放线程-超时存在,这样调用就不会无限等待,以防互斥锁从未释放或在应用程序环境认为的延迟时间内释放。

您是否意识到您给出的文档引用是用于与您编写的代码不同的方法?例如这个问题的目的是,布尔重载无论如何没有任何区别。Time参数用于定义超时,这是允许等待的最大时间
WaitOne
将尝试在超时过期之前获得所有权,从“调用时立即”^^^开始,这很简单,您得到的代码完全错误。很确定你已经知道,要得到你需要的答案,要求一本手册并不是一个好办法。单实例应用程序已经得到了.NET Framework的很好支持,而不是自己的应用程序。因此,在经过的2000毫秒内,它是否会尝试(例如)x amount if times来查看互斥锁是否被释放?是的,类似于此,但这因操作系统而异。不幸的是,我没有足够的知识来告诉您Windows互斥体是如何实现的(.Net互斥体只是Windows互斥体的包装器),也许对核心Windows更感兴趣的人可以提供帮助。