Для чего нужен и в каких случаях применяется на практике метод RuntimeHelpers.PrepareConstrainedRegions?
Update:
Пример кода, который не понял и в котором увидел этот метод:
var oldMode = GCSettings.LatencyMode;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
GCSettings.LatencyMode = GCLatencyMode.Batch;
}
finally
{
GCSettings.LatencyMode = oldMode;
}
Смотрите.
CER — это сокращение для «constrained execution region», регион ограниченного выполнения. В нём запрещён выброс внешних для кода исключений, не спровоцированных на языковом уровне — например, ThreadAbortException, OutOfMemoryException, StackOverflowException*.
Непосредственно за объявлением RuntimeServices.PrepareConstrainedRegions(); должен следовать блок try[/catch][/finally], в котором catch-часть, а также finally-часть превращается в регион ограниченного выполнения.
Для вашего кода это значит, что код GCSettings.LatencyMode = oldMode; не будет прерван внешними условиями. Это может быть важно, так как он меняет состояние всей программы.
CER не нужно в нормальном коде. Ваше приложение никогда не должно вызывать Thread.Abort, а переполнения стека просто не должно допускать. Поэтому писать код, «предохранящий» от этого, просто не нужно.
Дополнительное скучное чтение по теме:
*Для того, чтобы это работало, ваш код внутри региона обязан вызывать только код с ReliabilityContract'ом, не проводить аллокаций памяти, не делать виртуальных вызовов прямо или косвенно, вызовов через рефлексию, lock, сериализации, работы с многомерными массивами (!) и т. п. Ответственность за это лежит на программисте, поэтому если CER «не работает», виноват скорее всего программист.
Продвижение своими сайтами как стратегия роста и независимости