Деструкторы странные . Я пытался устранить необходимость использования одноразового шаблона, используя «умное» управление ссылками, гарантируя, что сборщик мусора сможет собирать объекты в нужное время. В одном из моих деструкторов мне пришлось ждать события от другого объекта, чего, как я заметил, не произошло. Приложение просто закрылось, а деструктор был прерван в середине выполнения. Я ожидаю, что деструктору всегда будет разрешено завершить работу, но, как показывает следующий тест, это неверно.
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 );
}
}
}
Итак, разве деструкторам не гарантировано завершение работы?