Вот простой трюк. Возможно, он не на 100% точен, но, вероятно, будет достаточно хорош.
Если вы можете получать уведомления о завершении, есть простой способ, который вы можете использовать.
Создайте объект и не сохраняйте ссылку на него. Когда объект завершен, вы инициируете свое событие, а затем создаете другой объект. Вы также не сохраняете ссылку на этот объект, но он будет действовать до тех пор, пока в следующий раз не будет выполнена достаточно полная коллекция.
Вот такой объект:
public class GCNotifier
{
public static event EventHandler GarbageCollected;
~GCNotifier()
{
if (Environment.HasShutdownStarted)
return;
if (AppDomain.CurrentDomain.IsFinalizingForUnload())
return;
new GCNotifier();
if (GarbageCollected != null)
GarbageCollected(null, EventArgs.Empty);
}
public void Start()
{
new GCNotifier();
}
}
Если вы хотите, вы можете добавить поддержку для остановки его, имея статическое логическое поле, которое не позволяет ему перезапускаться при следующей финализации.
Надеюсь, это поможет.