Thread.BeginCriticalRegion Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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.