2010-04-07 9 views
7

Czytałem o Reliability Features in .NET i napisałem następujące klasy zbadać ExecuteCodeWithGuaranteedCleanupKiedy program ExecuteCodeWithGuaranteedCleanup faktycznie gwarantuje czyszczenie?

class Failing 
{ 
    public void Fail() 
    { 
     RuntimeHelpers.PrepareConstrainedRegions(); 
     try 
     { 
     } 
     finally 
     { 
      RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(Code, Cleanup, "fail"); 
     } 
    } 

    private void Code(object message) 
    { 
     // Some code in here that will cause an exception... 
    } 

    private void Cleanup(object message, bool something) 
    { 
     Console.WriteLine(message); 
     Console.ReadLine(); 
    } 
} 

I eksperymentowali z różnymi organami kod na metodzie Code. Te, a ich wyniki runtime są wymienione poniżej

powodując OutOfMemoryException - Cleanupnie sprawdzony

List<string> ss = new List<string>(); 

while (true) 
{ 
    string s = new string('x', 1000000); 

    ss.Add(s); 
} 

powodując StackOverflowException - Cleanupnie sprawdzony

Code(message); // recursive call 

Spowodowanie a ExecutionEngineException - Cleanupnie sprawdzony

Environment.FailFast(message.ToString()); 

Spowodowanie ThreadAbortException - Cleanuprobi sprawdzony (jednak regularne try...finally można również złapać ten wyjątek)

Thread.CurrentThread.Abort(); 

więc pytania są

  • Czy poprawnie używam ExecuteCodeWithGuaranteedCleanup?
  • Kiedy jest ExecuteCodeWithGuaranteedCleanup rzeczywiście przydatne?
+1

Uruchom ten kod na hoście CLR, który implementuje ICLRPolicyManager. SQL Server. –

Odpowiedz

2

Niektóre wyjątki są krytyczne dla procesu, a wykonanie kodu dostarczonego przez użytkownika po prostu nie jest kontynuowane. Celem metody ExecuteCodeWithGuaranteedCleanup jest umożliwienie powrotu struktur danych w spójny stan. Jeśli proces ten umrze w każdym razie bez możliwości zatrzymania go, nie ma to żadnego celu. System operacyjny (zakładając, że działa poprawnie) automatycznie oczyści obiekty jądra, gdy proces się zakończy, niezależnie od przyczyny zakończenia procesu.

Zgodnie z wytycznymi Hansa, ICLRPolicyManager hosta wchodzi w grę, aby ustalić, które wyjątki są w ten sposób śmiertelne, gdy kod jest uruchamiany na określonym hoście (w szczególności na serwerze SQL). Zobacz ładną tabelę na dole tej strony dokumentacji: ICLRPolicyManager::SetActionOnFailure Method

Powiązane problemy