0

いくつかのスレッド コードをテストしています。LinqPad を使用して、2 つの異なる LinqPad タブから同じ名前の Mutex を取得できることに気付きました。私が診断した後、それはLinqPadでのみ発生し、通常のコードでは発生しないことに気付きました。

なぜそれが起こるのですか?私の知る限り、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();

このコードを 2 つの LinqPad タブに貼り付けると、一貫して問題が再現されますが、場合によっては 2 番目のタブを停止して開始する必要があります。

4

1 に答える 1

2

Mutex は GC によって収集されているため、最初のプログラムは 2 番目のプログラムが開始する前にそれを閉じます。

GC.KeepAlive(mtx)の後に追加して、ReadLineそれまでミューテックスを強制的に存続させます。

于 2011-02-08T18:03:16.170 に答える