不同的LinqPad选项卡获得相同的互斥锁?

时间:2011-02-08 17:43:51

标签: c# .net multithreading mutex linqpad

我正在测试一些线程代码,并且使用LinqPad我注意到我能够从两个不同的LinqPad选项卡中获取相同名称的Mutex。在诊断出我之后,我意识到它只发生在LinqPad而不是常规代码中。

任何帮助为什么会发生? AFAIK LinqPad使用不同的应用程序域来执行每个选项卡,但我不确定应该如何更改任何内容,因为我使用的是命名互斥锁。

以下是代码:

var mutexName = @"Global\TestMutex".Dump();
var createdNew = false;
var mtx = new Mutex(true, mutexName, out createdNew);

(createdNew ? "I own the mutex" : "I don't own the mutex").Dump();

mtx.WaitOne();  // Not really necessary

"I aquired the mutex".Dump();

string.Format("PID: {0} ThreadID: {1} AppDomainID: {2}",
    Process.GetCurrentProcess().Id,
    AppDomain.GetCurrentThreadId(),
    AppDomain.CurrentDomain.Id).Dump();
Util.ReadLine();

将此代码粘贴到两个LinqPad选项卡中,它将始终重现问题,有时您必须停止并启动第二个选项卡。

1 个答案:

答案 0 :(得分:2)

GC正在收集您的Mutex,以便第一个程序在第二个程序开始之前关闭它。

GC.KeepAlive(mtx)之后添加ReadLine以强制Mutex存活到那时为止。