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