0

我正在测试一些线程代码,并使用 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 选项卡中,它会始终重现问题,但有时您必须停止并启动第二个选项卡。

4

1 回答 1

2

GC 正在收集您的 Mutex,因此第一个程序在第二个程序启动之前将其关闭。

GC.KeepAlive(mtx)在之后添加ReadLine以强制互斥锁在此之前存活。

于 2011-02-08T18:03:16.170 回答