Pergunta

Basicamente Ouvi dizer que certas condições fará com que .net ao golpe passado, o bloco finally. Alguém sabe o que são essas condições?

Foi útil?

Solução

Duas possibilidades:

O bloco finally não será executada quando há uma StackOverflowException uma vez que não há espaço para a pilha até mesmo executar qualquer mais código. Ele também não será chamado quando há uma ExecutionEngineException, que podem surgir a partir de uma chamada para Environment.FailFast().

Outras dicas

A menos que o CLR explode e desce com um ExecutingEngineException (eu vi alguns no .net 1,1 dias com apenas a quantidade certa de interoperabilidade :) .. Eu acho que finalmente deve sempre executar.

Você pode obter uma situação em que o código no bloco try provoca uma SecurityException para ser lançada antes do bloco try entrou (em vez da exceção é lançada quando o método contendo é chamado (ver http://msdn.microsoft.com/en-us/library/fk6t46tz (VS.71) .aspx )), nesta situação, você nunca sequer entrar no bloco try para que o código no bloco finally nunca é chamado.

Outras possibilidades incluem StackOverflowException e ExecutingEngineException.

bloco Finally em background thread não pode executar. No entanto, ele depende da execução concluída de main foreground thread que termina a operação background thread mesmo antes da execução 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");
        }
    }
}

Há também método Application.Exit.

Nem o código que segue um bloco finally, nem o código em escopos externos, será executado sem o bloco finally tendo sido iniciado pela primeira vez (uma exceção dentro do bloco finally pode causar-lhe para sair prematuramente, em que a execução caso vai saltar para fora do finalizador para um escopo externo). Se o código antes do último bloco fica preso em um loop infinito ou um método que não sai, ou se o contexto de execução é destruído por completo, o bloco finally não executar.

Note que é adequado confiar em blocos finally, ao contrário dos métodos "Finalizar" (ou C # "destruidores") que não deve adequadamente ser invocado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top