【问题标题】:C# Mutex Timespan explained to newbieC# Mutex Timespan 向新手解释
【发布时间】:2015-01-20 15:08:46
【问题描述】:

我对 Mutex 完全陌生。

我不明白这是什么意思:

WaitOne(TimeSpan) 阻塞当前线程直到当前实例 接收信号,使用 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 秒,然后再检查线程上是否有锁 ?

【问题讨论】:

  • 您是否意识到您提供的文档引用与您编写的代码的方法不同?
  • 就这个问题而言,布尔重载无论如何都没有任何区别。
  • 时间参数用于定义timeout,即允许等待的最大时间。 WaitOne 会在超时到期前尝试获取所有权,从“调用时立即”开始^^
  • 嗯,这很简单,你把这段代码弄错了。很确定您已经知道,索取手册并不是获得所需答案的好方法。 .NET Framework 已经很好地支持单实例应用程序,不要自己编写。

标签: c# multithreading mutex


【解决方案1】:

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

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

所以底线是你传递什么值作为超时并不重要,对mutex.ReleaseMutex() 的调用无论如何都会立即释放线程 - 超时是存在的,这样调用就不会无限等待,以防互斥锁永远不会被释放或在应用程序的情况认为较晚的时期被释放。

【讨论】:

  • 所以在通过的 2000 毫秒内,它是否尝试例如x 量 if 次看互斥量是否被释放?
  • 是的,与此类似,但因操作系统而异。不幸的是,我没有足够的知识来告诉您如何实现 Windows 互斥锁(.Net 互斥锁只是 Windows 互斥锁的包装器),也许更热衷于核心 Windows 的人可以提供帮助。
猜你喜欢
  • 2021-11-19
  • 2011-03-30
  • 2017-10-03
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多