2011-02-08 1 views
0

Я тестирую некоторый код потоковой передачи, и, используя LinqPad, я заметил, что я могу получить тот же именованный Mutex из двух разных вкладок LinqPad. После диагностики для меня, когда я понял, что это происходит только в 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

Вы проверили варианты? Существуют некоторые настройки, связанные с переработкой доменов приложений. –

+0

Я не знал об этих параметрах, но я просто проверил их, и это не должно повлиять на результат. Помимо того, что обе вкладки запускаются одновременно, и независимо от Thread или AppDomain, они не должны иметь возможность одновременно получать одинаковые Mutex. – Yona

+0

Так как Joe Albahari (автор LinqPad) также написал книгу о нарезке, я уверен, что он сможет объяснить это. – sgmoore

ответ

2

Ваш Мьютекс собирается GC, так что первая программа закрывает его до начала второго.

Добавить GC.KeepAlive(mtx) после ReadLine, чтобы заставить Mutex сохраниться до тех пор.

+0

(Мой первый ответ был недоразумением) – SLaks

+0

Это не проблема GC.KeepAlive (mtx) ', которая исправляет проблему, поскольку код не достигнут. Это то, что 'mtx' ссылается на код, добавляя' var type = mtx.GetType(); 'имеет тот же эффект. Таким образом, в основном это оптимизация компилятора. – Yona

+1

@Yona: Это то, что делает KeepAlive. Это метод no-op, который просто заставляет вызывающего пользователя использовать переменную. http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx – SLaks

 Смежные вопросы

  • Нет связанных вопросов^_^