Что означает контекст выхода для wathandle.waitone?

StackOverflow https://stackoverflow.com/questions/7824497

  •  27-10-2019
  •  | 
  •  

Вопрос

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

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

Документы сказать:

ExitContext - истинный выйти из домена синхронизации для контекста перед ожиданием (если в синхронизированном контексте), и впоследствии повторно его; в противном случае, ЛОЖЬ.

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

Это было полезно?

Решение

Это также объясняет дальше на странице под замечаниями что:

Примечания о выходе из контекста

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

Когда ваш код выполняется в контексте нерефов, указание True для OpenContext приводит к выходу из потока выйти из управляемого контекста нерефоу (то есть, переходить к контексту по умолчанию) перед выполнением метода Waitone. Поток возвращается к исходному контексту нерефактуру после завершения вызова в метод Waitone.

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

Другие советы

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

А ExitContext Аргумент актуален только в удаленных сценариях. Прохождение истинный, Вы разрешаете приостановить текущий вызов, и еще один вызов был выставлен от клиента на сервер. Вы сделаете это, чтобы повысить пропускную способность, выбрав True только тогда, когда вы ожидаете, что вызов Waitone () займет некоторое время. Точные последствия для этого, однако, не очевидны для меня и не задокументированы где -либо, где я знаю. Перегрузка Waitone () (без тайм -аута) всегда проходит ЛОЖЬ, к сожалению, это создает некоторое напряжение на мое объяснение.

Боковая история, стоящая за этим методом ExitContext аргумент Это вызвало много хаоса, программисты начали использовать его, а затем обнаружили, что их программа выходит из строя при запуске в версии .NET Pre-Sp2. Оу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top