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似乎马上就被锁在了门外。我的印象是互斥锁只在线程之间共享,当进程退出时就会被销毁,所以共享同一互斥锁的两个独立进程应该是好的,对吧?
没有命名互斥实例在所有进程之间共享。另一个进程可以锁定互斥对象。
从您正在使用的Mutex构造函数的文档来看:
互斥有两种类型:本地互斥和命名系统互斥。如果使用接受名称的构造函数创建Mutex对象,则该对象将与该名称的操作系统对象相关联。命名系统互斥在整个操作系统中都是可见的,可以用来同步进程的活动。
至于你的第二个问题:
此外,如果应用程序在互斥对象释放之前崩溃,是否会导致这种行为?
这包含在Mutex:的文档中
如果一个线程在拥有一个互斥对象时终止,则称该互斥对象被放弃。互斥锁的状态被设置为已发出信号,下一个等待线程获得所有权。如果没有人拥有互斥锁,则会用信号通知互斥锁的状态。从的2.0版开始。NET Framework中,在获取互斥的下一个线程中抛出一个废弃互斥异常。的2.0版之前。NET Framework,未引发异常。
在应用程序终止的场景中,应该将互斥对象标记为已放弃。尝试获取Mutex
应引发AbandonedMutexException
。