Для чего нужен и в каких случаях применяется на практике метод 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 «не работает», виноват скорее всего программист.
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!
Как получить модель юзера и обработать до начала загрузки дочерних компонентов?