Для чего нужен метод RuntimeHelpers.PrepareConstrainedRegions?

179
17 августа 2017, 19:30

Для чего нужен и в каких случаях применяется на практике метод RuntimeHelpers.PrepareConstrainedRegions?

Update:

Пример кода, который не понял и в котором увидел этот метод:

var oldMode = GCSettings.LatencyMode;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
    GCSettings.LatencyMode = GCLatencyMode.Batch;
}
finally
{
    GCSettings.LatencyMode = oldMode;
}
Answer 1

Смотрите.

CER — это сокращение для «constrained execution region», регион ограниченного выполнения. В нём запрещён выброс внешних для кода исключений, не спровоцированных на языковом уровне — например, ThreadAbortException, OutOfMemoryException, StackOverflowException*.

Непосредственно за объявлением RuntimeServices.PrepareConstrainedRegions(); должен следовать блок try[/catch][/finally], в котором catch-часть, а также finally-часть превращается в регион ограниченного выполнения.

Для вашего кода это значит, что код GCSettings.LatencyMode = oldMode; не будет прерван внешними условиями. Это может быть важно, так как он меняет состояние всей программы.

CER не нужно в нормальном коде. Ваше приложение никогда не должно вызывать Thread.Abort, а переполнения стека просто не должно допускать. Поэтому писать код, «предохранящий» от этого, просто не нужно.

Дополнительное скучное чтение по теме:

  • Constrained Execution Regions
  • Code demonstrating the importance of a Constrained Execution Region
  • Keep Your Code Running with the Reliability Features of the .NET Framework

*Для того, чтобы это работало, ваш код внутри региона обязан вызывать только код с ReliabilityContract'ом, не проводить аллокаций памяти, не делать виртуальных вызовов прямо или косвенно, вызовов через рефлексию, lock, сериализации, работы с многомерными массивами (!) и т. п. Ответственность за это лежит на программисте, поэтому если CER «не работает», виноват скорее всего программист.

READ ALSO
Авторизация на фронт-энде

Авторизация на фронт-энде

Всем приветДелаю в первый раз SPA-приложение на Vue

205
Что за конструкция nodejs JavaScript js () => [дубликат]

Что за конструкция nodejs JavaScript js () => [дубликат]

На данный вопрос уже ответили:

185
How to edit .txt file in JavaScript? [требует правки]

How to edit .txt file in JavaScript? [требует правки]

Hello There! I want to append a string to thetxt file in JavaScript/AJAX, but I have no idea how to do that, please help!

174
Angular 4. Как получить модель юзера и обработать до начала загрузки дочерних компонентов?

Angular 4. Как получить модель юзера и обработать до начала загрузки дочерних компонентов?

Как получить модель юзера и обработать до начала загрузки дочерних компонентов?

207