Voici un article sur GC peut se produire au moment de l'exécution de code inattendu:Comment puis-je reproduire ce scénario Garbage Collection .NET
vie, GC.KeepAlive, poignée de recyclage - par cbrumme http://blogs.msdn.com/b/cbrumme/archive/2003/04/19/51365.aspx?wa=wsignin1.0
Ma question est comment puis-je reproduire GC forcé au point mentionné dans l'article? J'ai essayé de mettre GC.Collect() au début de OperateOnHandle(), et ai défini le destructeur pour la classe C mais ne semble pas fonctionner. Destructeur est invoqué toujours à la fin du programme.
@Jon, merci de m'avoir averti que je n'ai plus de débogueur. Maintenant, je suis capable de reproduire le problème décrit dans l'article, en utilisant la version de sortie optimisée de débogueur. Cela prouve que ce comportement GC ne change pas depuis .NET v1.
Code I utilisé:
class C1
{
// Some unmanaged resource handle
IntPtr _handle = IntPtr.Zero;
static void OperateOnHandle(IntPtr h)
{
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("After GC.Collect() call");
// Use the IntPtr here. Oops, invalid operation
}
public void m()
{
OperateOnHandle(_handle);
}
~C1()
{
// Release and destroy IntPtr here
Console.WriteLine("In destructor");
}
}
class Program
{
static void Main(string[] args)
{
C1 aC = new C1();
aC.m();
}
}
Sortie:
En destructor Après GC.Collect() appellent
C'est un vieil article (2003), il se peut donc que les dernières versions de .Net Framework aient abouti à un comportement différent. –
L'article était vraiment * sur * SafeHandle. Il ne pouvait pas encore le divulguer. –
@Hans, oui vous avez raison. Il s'agit vraiment de SafeHandler. – Sheen