Подтвердить что ты не робот

Условия, когда, наконец, не выполняются в блоке .net try..finally

В основном я слышал, что определенные условия вызовут .net, чтобы пропустить последний блок. Кто-нибудь знает, что это за условия?

4b9b3361

Ответ 1

Две возможности:

Блок finally не будет выполняться, когда есть StackOverflowException, так как в стеке нет места, чтобы даже выполнить какой-либо код. Он также не будет вызываться, когда существует ExecutionEngineException, который может возникнуть при вызове Environment.FailFast().

Ответ 2

Если CLR не взорвется и не спустится с ExecutingEngineException (я видел несколько в .net 1.1 дней с нужным количеством COM Interop:).. Я думаю, что в конце концов должно всегда выполнить.

Ответ 3

Вы можете получить ситуацию, когда код в блоке try вызывает сброс SecurityException до ввода блока try (вместо этого исключение вызывается при вызове метода contains (см. http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx)), в этой ситуации вы даже не входите в блок try, поэтому код в блоке finally никогда не вызывается.

Другие возможности включают StackOverflowException и ExecutingEngineException.

Ответ 4

Finally block on background thread может не выполняться. Однако это зависит от завершенного выполнения main foreground thread, который завершает операцию background thread еще до полного выполнения 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");
        }
    }
}

Ответ 5

Существует также метод Application.Exit.

Ответ 6

Ни один код, который следует за блоком finally, или код во внешних областях, не будет выполняться без первого запуска блока finally (исключение в блоке finally может привести к его преждевременному завершению, и в этом случае выполнение выскочит из финализатор для внешнего охвата). Если код до блока finally застревает в бесконечном цикле или методе, который никогда не выходит, или если контекст выполнения полностью уничтожен, блок finally не будет выполняться.

Обратите внимание на то, что в конечном итоге блокировать, в отличие от методов "Finalize" (или С# "деструкторов" ), на которые не следует полагаться должным образом.