Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Почему в using не вызывается Dispose


Автор: Stas123 16.12.2013, 17:06
Как вы думаете, почему при исключении в секции using не вызывается Dispose?

освобождаемый класс
Код

internal sealed class ExceptionInConstructor : IDisposable
    {
        public void Use()
        {
            Console.WriteLine("Ok");
            System.Diagnostics.Debug.WriteLine("Ok");
            throw new Exception();
        }

        public void Dispose()
        {
            Console.WriteLine("Dispose");
            System.Diagnostics.Debug.WriteLine("Dispose");
            using (var file = new StreamWriter("er.txt"))
            {
                file.WriteLine("Disp");
            }
            Console.WriteLine("Dispose");
            System.Diagnostics.Debug.WriteLine("Dispose");
        }
    }


Использование
Код

private static void TestUsing()
        {
            using (var ec = new ExceptionInConstructor())
            {
                ec.Use();
            }
        }

Автор: jonie 16.12.2013, 22:06
Почему это не вызывается? Разве что у вас неотлавливается исключение и приложение завершает работу самоубийством, но даже в этом случае Dispose будет вызван (правда уже после фатал эррор).

UPD: finally блок (а стало быть и Dispose) может быть не вызван в случае необрабатываемого exception-а, подробнее смотри ниже в обсуждении.

Автор: Stas123 18.12.2013, 11:30
Да, исключение не отлавливается и программа падает, но я не вижу, чтобы Диспоуз сработал. Т.е. файл не создается. Почему? У меня консольное приложение, по идее все идет в одном потоке. Или я не прав?

Автор: jonie 18.12.2013, 13:46
Все это описано же в описании языка:
Цитата

Within a handled exception, the associated finally block is guaranteed to be run. However, if the exception is unhandled, execution of the finally block is dependent on how the exception unwind operation is triggered. That, in turn, is dependent on how your computer is set up. For more information, see Unhandled Exception Processing in the CLR.
 (с) http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

А вот тут подробности: http://msdn.microsoft.com/ru-ru/magazine/cc793966.aspx

Автор: Stas123 19.12.2013, 11:43
Ясно, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)