Thread.BeginCriticalRegion Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Уведомляет узел, что выполнение близится ко входу в область кода, в которой эффекты прерывания выполнения или неуправляемого выполнения могут повлиять на другие задачи в домене приложения.
public:
static void BeginCriticalRegion();
public static void BeginCriticalRegion ();
static member BeginCriticalRegion : unit -> unit
Public Shared Sub BeginCriticalRegion ()
Примеры
В следующем примере показано использование 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.
}
}
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, например Microsoft SQL Server 2005, могут устанавливать различные политики для сбоев в критических и некритических областях кода. Критическая область — это одна из тех, в которых влияние прерывания потока или необработанного исключения может не ограничиваться текущей задачей. В отличие от этого, прерывание или сбой в некритической области кода влияет только на задачу, в которой возникла ошибка.
Например, рассмотрим задачу, которая пытается выделить память при удержании блокировки. Если выделение памяти завершается ошибкой, то прерывание текущей задачи недостаточно для обеспечения стабильности AppDomain , так как в домене могут находиться другие задачи, ожидающие той же блокировки. Если текущая задача прервана, другие задачи могут быть взаимоблокированы.
При возникновении сбоя в критической области узел может решить выгрузку всего лишь вместо того, чтобы AppDomain принимать риск продолжения выполнения в потенциально нестабильном состоянии. Чтобы сообщить узлу о том, что код вводит критическую область, вызовите BeginCriticalRegion . Вызывается, EndCriticalRegion когда выполнение возвращается к некритической области кода.
при использовании этого метода в коде, который выполняется в SQL Server 2005, требуется, чтобы код выполнялся на самом верхнем уровне защиты узла.