Поделиться через


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

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

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