Thread.EndCriticalRegion Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Уведомляет узел, что выполнение близится ко входу в область кода, в которой эффекты прерывания выполнения или неуправляемой ошибки ограничены текущей задачей.
public:
static void EndCriticalRegion();
public static void EndCriticalRegion ();
static member EndCriticalRegion : unit -> unit
Public Shared Sub EndCriticalRegion ()
Примеры
В следующем примере демонстрируется использование BeginCriticalRegion методов и EndCriticalRegion для разделения блока кода на критические и некритичные области.
using namespace System::Threading;
public ref class MyUtility
{
public:
void PerformTask()
{
// Code in this region can be aborted without affecting
// other tasks.
//
Thread::BeginCriticalRegion();
//
// The host might decide to unload the application domain
// if a failure occurs in this code region.
//
Thread::EndCriticalRegion();
//
// Code in this region can be aborted without affecting
// other tasks.
}
};
using System.Threading;
public class MyUtility
{
public void PerformTask()
{
// Code in this region can be aborted without affecting
// other tasks.
//
Thread.BeginCriticalRegion();
//
// The host might decide to unload the application domain
// if a failure occurs in this code region.
//
Thread.EndCriticalRegion();
//
// Code in this region can be aborted without affecting
// other tasks.
}
}
open System.Threading
let performTask () =
// Code in this region can be aborted without affecting
// other tasks.
//
Thread.BeginCriticalRegion()
//
// The host might decide to unload the application domain
// if a failure occurs in this code region.
//
Thread.EndCriticalRegion()
//
// Code in this region can be aborted without affecting
// other tasks.
Imports System.Threading
Public Class MyUtility
Public Sub PerformTask()
' Code in this region can be aborted without affecting
' other tasks.
'
Thread.BeginCriticalRegion()
'
' The host might decide to unload the application domain
' if a failure occurs in this code region.
'
Thread.EndCriticalRegion()
' Code in this region can be aborted without affecting
' other tasks.
End Sub
End Class
Комментарии
Узлы среды CLR, такие как Майкрософт SQL Server 2005, могут устанавливать различные политики для сбоев в критических и некритических областях кода. Критически важной областью является область, в которой последствия прерывания потока или необработанного исключения могут не ограничиваться текущей задачей. В отличие от этого, прерывание или сбой в некритичной области кода влияет только на задачу, в которой возникает ошибка.
Например, рассмотрим задачу, которая пытается выделить память при удержании блокировки. Если выделение памяти завершается сбоем, прерывание текущей задачи недостаточно для обеспечения стабильности AppDomain, так как в домене могут быть другие задачи, ожидающие той же блокировки. Если текущая задача будет завершена, другие задачи могут оказаться взаимоблокировкой.
При сбое в критическом регионе узел может решить выгрузить весь AppDomain объект, а не рисковать продолжением выполнения в потенциально нестабильном состоянии. Чтобы сообщить узлу о том, что код вводит критически важный регион, вызовите .BeginCriticalRegion Вызов, EndCriticalRegion когда выполнение возвращается в некритичную область кода.
Для использования этого метода в коде, который выполняется в SQL Server 2005, код должен выполняться на самом высоком уровне защиты узла.