Основным драйвером для этой функциональности была поддержка строгих требований SQL Server для интеграции CLR в SQL Server 2005. Вероятно, для того, чтобы другие могли использовать и, вероятно, по юридическим причинам, эта глубокая интеграция была опубликована как хостинг API, но технические требования были SQL Servers. Помните, что в SQL Server MTBF измеряется в месяцах, а не в часах, и перезапуск процесса из-за возникновения необработанного исключения совершенно неприемлем.
Эта статья журнала MSDN, вероятно, является лучшим описанием технических требований, для которых была создана среда выполнения с ограничениями.
ReliabilityContract используется для украшения ваших методов, чтобы указать, как они работают с точки зрения потенциально асинхронных исключений (ThreadAbortException, OutOfMemoryException, StackOverflowException). Область ограниченного выполнения определяется как раздел catch или finally (или сбой) блока try, которому непосредственно предшествует вызов System.Runtime.CompilerServices.RuntimeServices.PrepareConstrainedRegions().
System.Runtime.CompilerServices.RuntimeServices.PrepareConstrainedRegions();
try
{
// this is not constrained
}
catch (Exception e)
{
// this IS a CER
}
finally
{
// this IS ALSO a CER
}
Когда метод ReliabilityContract используется внутри CER, с ним происходят две вещи. Метод будет предварительно подготовлен JIT, чтобы он не вызывал JIT-компилятор при первом выполнении, который может попытаться использовать саму память и вызвать собственные исключения. Также, находясь внутри CER, среда выполнения обещает не генерировать исключение ThreadAbort и будет ждать, чтобы генерировать исключение, пока не завершится CER.
Итак, вернемся к вашему вопросу; Я все еще пытаюсь придумать простой пример кода, который прямо ответит на ваш вопрос. Однако, как вы, возможно, уже догадались, для простейшего примера потребуется довольно много кода, учитывая асинхронный характер проблемы, и, скорее всего, это будет код SQLCLR, поскольку именно в этой среде CER будут использоваться с наибольшей выгодой.
person
Peter Oehlert
schedule
28.08.2009