Гарантируется ли завершение работы деструкторов? #39;

Деструкторы странные . Я пытался устранить необходимость использования одноразового шаблона, используя «умное» управление ссылками, гарантируя, что сборщик мусора сможет собирать объекты в нужное время. В одном из моих деструкторов мне пришлось ждать события от другого объекта, чего, как я заметил, не произошло. Приложение просто закрылось, а деструктор был прерван в середине выполнения. Я ожидаю, что деструктору всегда будет разрешено завершить работу, но, как показывает следующий тест, это неверно.

using System;
using System.Diagnostics;
using System.Threading;


namespace DestructorTest
{
    class Program
    {
        static void Main( string[] args )
        {
            new DestructorTest();
            new LoopDestructorTest();
            using ( new DisposableTest() ) { }
        }
    }

    class DestructorTest
    {
        ~DestructorTest()
        {
            // This isn't allowed to finish.
            Thread.Sleep( 10000 );
        }       
    }

    class LoopDestructorTest
    {
        ~LoopDestructorTest()
        {           
            int cur = 0;
            for ( int i = 0; i < int.MaxValue; ++i )
            {
                cur = i;
            }
            // This isn't allowed to finish.
            Debug.WriteLine( cur );
        }
    }

    class DisposableTest : IDisposable
    {
        public void Dispose()
        {
            // This of course, is allowed to finish.
            Thread.Sleep( 10000 );
        }
    }
}

Итак, разве деструкторам не гарантировано завершение работы?

7
задан Steven Jeuris 30 March 2012 в 11:01
поделиться