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, требуется, чтобы код выполнялся на самом верхнем уровне защиты узла.

Применяется к

См. также раздел