Подтвердить что ты не робот

Что означает контекст вывода для WaitHandle.WaitOne означает?

Я пытаюсь использовать мьютекс для защиты доступа к некоторому оборудованию из нескольких потоков, но я смущен тем, что параметр exitContext означает/делает:

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

Документы говорят:

exitContext - true, чтобы выйти из домена синхронизации для контекста перед ожиданием (если в синхронном контексте) и повторно получить его после; в противном случае false.

... но что это значит и каковы последствия его установки как истинного, так и ложного? Я установил его в настоящее время, и код, похоже, работает, но я нервничаю, что я не совсем понимаю, что он под капотом!

4b9b3361

Ответ 1

Он также объясняет далее на странице в разделе Примечания, что:

Заметки о выходе из контекста

Параметр exitContext не действует, если только метод WaitOne вызываемый изнутри управляемого контекста. Это может произойти, если ваш поток находится внутри вызова экземпляра класса, полученного из ContextBoundObject. Даже если вы в настоящее время выполняете метод на класс, который не является результатом ContextBoundObject, например String, вы может быть в контексте небезопасности, если объект ContextBoundObject находится на вашем стек в текущем домене приложения.

Когда ваш код выполняется в контексте небезопасности, указывая true для exitContext приводит к тому, что поток отключается контекст (то есть переход к контексту по умолчанию) до выполнение метода WaitOne. Поток возвращается к оригиналу nondefault после завершения вызова метода WaitOne.

Это может быть полезно, когда класс, связанный с контекстом, имеет SynchronizationAttribute. В этом случае все обращения к членам класс автоматически синхронизируются, а домен синхронизации это весь код кода для класса. Если код в стеке вызовов член вызывает метод WaitOne и указывает значение true для exitContext, поток выходит из домена синхронизации, разрешая поток, который является заблокирован при вызове любого члена объекта для продолжения. Когда Возвращает метод WaitOne, поток, который сделал вызов, должен ждать повторно введите домен синхронизации.

Ответ 2

Раздел "Замечание" на странице MSDN читается, конечно, как полный gobbledegook. Контексты выполнения - это хорошо скрытая информация о реализации в .NET. Я просто скажу вам, что я перевернул инженером, не имея возможности полностью прибить его.

Аргумент exitContext имеет значение только для сценариев удаленного доступа. Передавая true, вы разрешаете приостановить текущий вызов, а другой вызов должен быть маршалирован с клиента на сервер. Вы бы сделали это, чтобы повысить пропускную способность, выбрав true, только если вы ожидаете, что вызов WaitOne() займет некоторое время. Точные последствия этого, однако, не очевидны для меня и не документированы в любом месте, о котором я знаю. Перегрузка WaitOne() (без тайм-аута) всегда пропускает ложь, что, к сожалению, накладывает определенную нагрузку на мое объяснение.

Постепенной причиной этого метода является то, что он настолько плохо понимает, что Microsoft решила отказаться от обратной совместимости в .NET 2. Они добавили перегрузку WaitOne (int) в пакет обновления 2. Что передает false для аргумента exitContext. Это вызвало много хаоса, программисты начали использовать его, а затем обнаружили, что их программа терпит неудачу при запуске в версии до версии SP2.NET. Уч.