Condiciones en las que finalmente no se ejecuta en un intento .net... finalmente bloquear

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Básicamente, he oído que ciertas condiciones harán que .net supere el bloque final.¿Alguien sabe cuáles son esas condiciones?

¿Fue útil?

Solución

Dos posibilidades:

El bloque finalmente no se ejecutará cuando haya un StackOverflowException ya que no hay espacio en la pila para ejecutar más código.Tampoco será llamado cuando haya un ExecutionEngineException, que puede surgir de una llamada a Environment.FailFast().

Otros consejos

A menos que el CLR explote y caiga con una ExecutingEngineException (he visto algunas en los días .net 1.1 con la cantidad justa de interoperabilidad COM :) ..Creo que finalmente debería siempre ejecutar.

Puede darse una situación en la que el código en el bloque try provoca que se lance una SecurityException antes de que se ingrese el bloque try (en lugar de eso, la excepción se lanza cuando se llama al método que lo contiene (consulte http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx)), en esta situación ni siquiera ingresas el bloque try, por lo que nunca se llama al código en el bloque finalmente.

Otras posibilidades incluyen StackOverflowException y ExecutingEngineException.

Finally bloquear en background thread no podrá ejecutarse.Sin embargo, depende de la ejecución completa de main foreground thread que termina background thread operación incluso antes de la ejecución completa de background thread.

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");
        }
    }
}

También existe el método Application.Exit.

Ni el código que sigue a un bloque finalmente, ni el código en ámbitos externos, se ejecutará sin que el bloque finalmente se haya iniciado primero (una excepción dentro del bloque finalmente puede causar que salga prematuramente, en cuyo caso la ejecución saltará del finalizador a un ámbito exterior).Si el código anterior al bloque finalmente se atasca en un bucle sin fin o en un método que nunca sale, o si el contexto de ejecución se destruye por completo, el bloque finalmente no se ejecutará.

Tenga en cuenta que es apropiado confiar en los bloques finalmente, a diferencia de los métodos "Finalizar" (o "destructores" de C#, en los que no se debe confiar adecuadamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top