2011-02-08 79 views
0

我正在測試一些線程代碼,並且使用LinqPad我注意到我能夠從兩個不同的LinqPad選項卡中獲得同名的Mutex。在爲我診斷後,我意識到它只發生在LinqPad中,而不是在普通代碼中。不同的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

你檢查了選項嗎?在那裏有一些與回收應用程序域相關的設置。 – 2011-02-08 17:46:18

+0

我不知道這些選項,但我只是檢查它們,它不應該影響結果。除了兩個標籤同時運行,無論Thread或AppDomain如何,它們都不應該一次就能夠獲得同名的互斥體 – Yona 2011-02-08 17:50:53

回答

2

您的Mutex正在被GC收集,以便第一個程序在第二個程序開始之前關閉它。

ReadLine之後加上GC.KeepAlive(mtx)強制互斥體在此之前存活。