Bedingungen, wenn nicht ausführen schließlich nicht in einem .net try..finally Block

StackOverflow https://stackoverflow.com/questions/111597

  •  02-07-2019
  •  | 
  •  

Frage

Im Grunde habe ich gehört, dass bestimmte Bedingungen verursachen .net finally-Block zu blasen Vergangenheit. Hat jemand wissen, was diese Bedingungen sind?

War es hilfreich?

Lösung

Zwei Möglichkeiten:

Der finally-Block wird nicht ausgeführt, wenn es eine StackOverflowException ist, da es auf dem Stapel keinen Raum zu noch mehr Code auszuführen. Es wird auch nicht aufgerufen werden, wenn ein ExecutionEngineException ist, die von einem Aufruf Environment.FailFast() entstehen können.

Andere Tipps

Wenn der CLR bläst auf und geht nach unten mit einem ExecutingEngineException (I 1,1 Tage mit genau der richtigen Menge von COM Interop ein paar in der .net gesehen habe :) .. Ich glaube, schließlich sollte immer auszuführen.

Sie können eine Situation, wo der Code im try-Block eine Security geworfen werden verursacht, bevor der try-Block (statt die Ausnahme eingegeben wird ausgelöst, wenn die umschließende Methode aufgerufen wird (siehe http://msdn.microsoft.com/en-us/library/fk6t46tz (VS.71) aspx )), in dieser Situation, die Sie nicht einmal den try-Block eingeben, damit der Code im finally-Block wird nie genannt.

Andere Möglichkeiten sind Stackoverflow und ExecutingEngineException.

Finally Block auf background thread kann nicht ausgeführt werden. Allerdings Es hängt von der fertigen Ausführung von main foreground thread dem background thread Betrieb auch vor der vollständigen Ausführung von background thread beendet wird.

class Program
{

    static void Main(string[] args)
    {
        Program prgm = new Program();
        Thread backgroundThread = new Thread(prgm.CheckBgThread);
        backgroundThread.IsBackground = true;
        backgroundThread.Start();
        Console.WriteLine("Closing the program....");
    }

    void CheckBgThread()
    {
        try
        {
            Console.WriteLine("Doing some work...");
            Thread.Sleep(500);
        }
        finally
        {
            Console.WriteLine("This should be always executed");
        }
    }
}

Es gibt auch Application.Exit Methode.

Weder Code, der ein schließlich Block folgt, noch Code in Außenumfängen wird, ausführen, ohne die schließlich wurde Block zuerst gestartet (eine Ausnahme innerhalb des schließlich Blockes kann es zu früh zu beenden, wobei in diesem Fall der Ausführung aus dem heraus springt finalizer zu einem äußeren Umfang). Wenn Code vor dem finally-Block wird in einer Endlos-Schleife oder ein Verfahren fest, die nie verlassen hat, oder wenn der Ausführungskontext ganz zerstört wird, wird die finally-Block nicht ausgeführt werden.

Beachten Sie, dass es richtig ist, auf schließlich Blöcke zu verlassen, im Gegensatz zu „Finalisierung“ Methoden (oder C # „Destruktoren“), die auf nicht ordnungsgemäß verlassen werden soll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top