Mutex.waitOne在特定机器上总是返回False

本文关键字:返回 False 机器 waitOne Mutex | 更新日期: 2023-09-27 17:58:40

我完全被难住了。我有一段代码依赖于互斥锁来保护它。当我在我的开发机器和测试机器上运行这段代码时,它运行得很好。但当我把它推到生产机器上时,它失败了。

但关键是,它曾经工作过,我没有对这个特定的块进行任何代码更改。但等等,还有更多!我有第二个过程,它使用了完全相同的代码块,它运行得很好!

互斥被声明为:

Mutex _mutex = new Mutex(false, "SendTextMessage_11A52B63-4FC6-46DF-B72C-C45B225D4143"); 

使用它的代码块是这样的:

        public override void ForwardTextMessagesToDevice()
    {
        Trace.WriteLine("Here1");
        if (!_mutex.WaitOne(30000))
        {
            Trace.WriteLine("Here2");
            Trace.WriteLine(String.Format("return mutex ForwardTextMessage: {0} {1}", this.Name, DateTime.Now));
            return; 
        }
        try
        {
            Trace.WriteLine("Here3");
            ScheduledReports();
        }
        finally
        {
            Trace.WriteLine("Here4");
            _mutex.ReleaseMutex();
        }

跟踪输出如下:

Here1
Here2
return mutex ForwardTextMessage: Method 2/11/2013 3:59:06 PM
Here1
Here2
return mutex ForwardTextMessage: Method 2/11/2013 4:00:06 PM

Mutex似乎马上就被锁在了门外。我的印象是互斥锁只在线程之间共享,当进程退出时就会被销毁,所以共享同一互斥锁的两个独立进程应该是好的,对吧?此外,如果应用程序在互斥对象释放之前崩溃,是否会导致这种行为?

编辑:我差点忘了。以前我的应用程序随机崩溃,我不得不强制退出它。

Mutex.waitOne在特定机器上总是返回False

Mutex似乎马上就被锁在了门外。我的印象是互斥锁只在线程之间共享,当进程退出时就会被销毁,所以共享同一互斥锁的两个独立进程应该是好的,对吧?

没有命名互斥实例在所有进程之间共享。另一个进程可以锁定互斥对象。

从您正在使用的Mutex构造函数的文档来看:

互斥有两种类型:本地互斥和命名系统互斥。如果使用接受名称的构造函数创建Mutex对象,则该对象将与该名称的操作系统对象相关联。命名系统互斥在整个操作系统中都是可见的,可以用来同步进程的活动。

至于你的第二个问题:

此外,如果应用程序在互斥对象释放之前崩溃,是否会导致这种行为?

这包含在Mutex:的文档中

如果一个线程在拥有一个互斥对象时终止,则称该互斥对象被放弃。互斥锁的状态被设置为已发出信号,下一个等待线程获得所有权。如果没有人拥有互斥锁,则会用信号通知互斥锁的状态。从的2.0版开始。NET Framework中,在获取互斥的下一个线程中抛出一个废弃互斥异常。的2.0版之前。NET Framework,未引发异常。

在应用程序终止的场景中,应该将互斥对象标记为已放弃。尝试获取Mutex应引发AbandonedMutexException