【发布时间】:2013-02-14 04:46:31
【问题描述】:
我写了一小段代码。 像下面的东西
public static void SetLicence1()
{
Console.WriteLine("Setting Aspose Licence in Thread1 ");
Console.WriteLine(SetAsposeLicense());
}
public static void SetLicence2()
{
Console.WriteLine("Setting Aspose Licence in Thread2 ");
Console.WriteLine(SetAsposeLicense());
}
public static bool SetAsposeLicense()
{
try
{
//Declare Mutex variable:
using (Mutex mutex = new System.Threading.Mutex(false, "Test"))
{
mutex.WaitOne(TimeSpan.FromSeconds(5));
var objLic = new License();
objLic.SetLicense(@"C:\Nivedita\License\Aspose.Cells.lic");
mutex.ReleaseMutex();
}
return true;
}
catch(Exception ex)
{
Console.WriteLine(ex.StackTrace);
return false;
}
}
}
public class TestClass
{
public static void Main()
{
Thread tid1 = new Thread(new ThreadStart(ThreadClass.SetLicence1));
Thread tid2 = new Thread(new ThreadStart(ThreadClass.SetLicence2));
tid1.Start();
tid2.Start();
Console.Read();
}
}
这段代码运行良好。但在这里我的问题是,WaitOne() 方法是否有可能卡在进程中或跨进程而互斥对象没有被释放?虽然我用过 mutex.ReleaseMutex()。
【问题讨论】:
-
我发现你不检查 WaitOne 的结果很不寻常。你关心它是否超时或被中断?否则,在我看来你在这个简单的例子中很好。但是,如果您在超时的情况下调用 WaitOne,则检查结果似乎是谨慎的
-
它永远不会在 WaitOne() 调用中冻结,您的互斥锁完全不起作用。每个线程都会创建自己的互斥体,因此没有什么可以阻止它。当两个线程同时分配相同的命名互斥锁时,可能会发生崩溃。您不妨删除代码。
-
感谢您的回复。但是我为进程间通信创建了命名互斥体。
-
是的,我担心 waitOne 是否被中断或卡在某个地方。我将放置检查waitOne结果的代码..但在这里我想知道是否有任何东西将WaitOne置于一个永远不会被释放的循环中,以防我没有使用Timeout with WaitOne方法
-
@HansPassant “每个线程都创建自己的互斥体,因此没有什么可以阻止它。当两个线程同时分配同一个命名的互斥体时,可能会发生崩溃”?