Udostępnij za pośrednictwem


Thread.BeginCriticalRegion Metoda

Definicja

Powiadamia hosta, że wykonanie ma wprowadzić region kodu, w którym skutki przerwania wątku lub nieobsługiwanego wyjątku mogą zagrozić innym zadaniam w domenie aplikacji.

public:
 static void BeginCriticalRegion();
public static void BeginCriticalRegion ();
static member BeginCriticalRegion : unit -> unit
Public Shared Sub BeginCriticalRegion ()

Przykłady

W poniższym przykładzie pokazano użycie BeginCriticalRegion metod i EndCriticalRegion do dzielenia bloku kodu na regiony krytyczne i niekrytyczne.

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

Uwagi

Hosty środowiska uruchomieniowego języka wspólnego (CLR), takie jak Microsoft SQL Server 2005, mogą ustanowić różne zasady dotyczące błędów w krytycznych i niekrytycznych regionach kodu. Region krytyczny to region, w którym skutki przerwania wątku lub nieobsługiwanego wyjątku mogą nie być ograniczone do bieżącego zadania. Natomiast przerwanie lub niepowodzenie w niekrytycznym regionie kodu wpływa tylko na zadanie, w którym występuje błąd.

Rozważmy na przykład zadanie, które próbuje przydzielić pamięć podczas przechowywania blokady. Jeśli alokacja pamięci zakończy się niepowodzeniem, przerwanie bieżącego zadania nie jest wystarczające, aby zapewnić stabilność AppDomainelementu , ponieważ w domenie mogą znajdować się inne zadania oczekujące na tę samą blokadę. Jeśli bieżące zadanie zostanie zakończone, inne zadania mogą zostać zakleszczone.

W przypadku wystąpienia awarii w regionie krytycznym host może zdecydować się na zwolnienie całego AppDomain , a nie na ryzyko kontynuowania wykonywania w stanie potencjalnie niestabilnym. Aby poinformować hosta, że kod wchodzi w krytyczny region, wywołaj metodę BeginCriticalRegion. Wywołaj wywołanie EndCriticalRegion , gdy wykonanie powróci do niekrytycznego regionu kodu.

Użycie tej metody w kodzie uruchamianym w SQL Server 2005 wymaga uruchomienia kodu na najwyższym poziomie ochrony hosta.

Dotyczy

Zobacz też