Domanda

Fondamentalmente ho sentito che alcune condizioni faranno saltare .net oltre il blocco infine. Qualcuno sa quali sono queste condizioni?

È stato utile?

Soluzione

Due possibilità:

Il blocco finally non verrà eseguito quando c'è StackOverflowException poiché non c'è spazio nello stack per eseguire anche altro codice. Inoltre, non verrà chiamato quando c'è un ExecutionEngineException , che può derivare da una chiamata a Environment.FailFast () .

Altri suggerimenti

A meno che il CLR non esploda e vada in crash con ExecutingEngineException (ne ho visti alcuni nei giorni .net 1.1 con la giusta quantità di interoperabilità COM :) .. Penso che finalmente dovrebbe sempre esegui.

È possibile ottenere una situazione in cui il codice nel blocco try provoca il lancio di SecurityException prima dell'inserimento del blocco try (invece viene generata l'eccezione quando viene chiamato il metodo di contenimento (vedere http://msdn.microsoft.com/en-us/library/fk6t46tz (VS.71) .aspx )), in questa situazione non inserisci nemmeno il blocco try, quindi il codice nel blocco finally non viene mai chiamato.

Altre possibilità includono StackOverflowException ed ExecutingEngineException.

Il blocco

Infine su thread in background potrebbe non essere eseguito. Tuttavia, dipende dalla completa esecuzione del thread in primo piano principale che termina l'operazione thread in background anche prima dell'esecuzione completa del thread in background .

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

Esiste anche il metodo Application.Exit.

Né il codice che segue un blocco finally, né il codice negli ambiti esterni, verrà eseguito senza che il blocco finally sia stato avviato per primo (un'eccezione all'interno del blocco finally può causare la sua uscita prematura, nel qual caso l'esecuzione salterà fuori dal finalizzatore a un ambito esterno). Se il codice prima del blocco finally viene bloccato in un ciclo infinito o in un metodo che non esce mai, o se il contesto di esecuzione viene distrutto del tutto, il blocco finally non verrà eseguito.

Nota che è corretto fare affidamento sui blocchi infine, diversamente da " Finalizza " metodi (o C # "distruttori") su cui non si deve fare correttamente affidamento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top