2016-01-26 25 views
2

我有一个全新的应用程序,我正在开发。我是唯一使用它的人,所以我不可能与另一个人竞争。然而,即使如此,Mutex往往失败。这是我的代码示例。Mutex偶尔失败

using (Mutex mutex = new Mutex(false, @"Global\MS_NBR")) 
{ 
System.Diagnostics.Trace.WriteLine("Before " + @"Global\MS_NBR"); 
if (!mutex.WaitOne(TimeSpan.FromSeconds(30), false)) 
     throw new ArgumentOutOfRangeException(); 
System.Diagnostics.Trace.WriteLine("After " + @"Global\MS_NBR"); 
    ..Here I assign a unique member number.. (runs in a fraction of a second) 
mutex.ReleaseMutex(); 
} 

这个工作,不时,但非常频繁抛出ArgumentOutOfRangeException,这表明对我来说,它不能在30秒内获得互斥。

+0

您正在收到的错误表示您在新增互斥锁的使用线? – AlG

+0

@AlG不,它是'WaitOne'返回false并且OP引发异常的时候。 – juharr

+0

您是唯一使用'Mutex'的应用程序,但您是否在各种线程中调用此例程?线程是否循环? –

回答

0

编辑本节可能不适用,但我会试一试。我从来没有使用一个有名的互斥体,而是静态分配的互斥体,并且从来没有任何问题。

这一行:

using (Mutex mutex = ... 

你分配一个名为全球Mutex和处置它时,using {}条款结束。

它可能有助于静态地定义它,而不是:

private static Mutex mutex = ... 

从来没有处理它,永远不会重建。只要应用程序运行,它就只是一个对象。

+1

他正在使用一个已命名的互斥体,因此每次重新实例化它都不会影响排他性。 – Mitch

+0

啊,是的,我错过了那一个。 – pid