我正在测试一些线程代码,并且使用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选项卡中,它将始终重现问题,有时您必须停止并启动第二个选项卡。
答案 0 :(得分:2)
GC正在收集您的Mutex,以便第一个程序在第二个程序开始之前关闭它。
在GC.KeepAlive(mtx)
之后添加ReadLine
以强制Mutex存活到那时为止。