2012-01-11 17 views
6

me encontré con una pregunta de la entrevista, que yo no sabía la respuesta (poca ayuda :)) así se manifestó algo por el estilo:Finalizer atrapado en un bucle infinito

Class SomeClass : IDisposable 
{ 
    public void Dispose() 
    { 
     while(true) 
     { 
     } 
    } 

    ~SomeClass() 
    { 
     Dispose(); 
    } 
} 

1) se pone finalizó el objeto cuando ya no se hace referencia después del próximo GC? Mi respuesta fue NO, porque el hilo de finalización se bloqueará en el ciclo infinito.

2) ¿Qué se podría hacer en el Desechar para poner fin a la finalización y el número de veces continuará el bucle antes de que se elimina el objeto de (a cabo tomando en cuenta el tiempo que pasará en la próxima generación)

no soy particularmente claro de la pregunta exacta (2) .I poco acabó el tiempo ...

al no conocer la respuesta que poner un contador estático que llega a 3 y las llamadas se rompen y afirmó 3 que técnicamente sería trabajo :), pero esa no es la respuesta

Supongo que tiene algo que ver con GC .SupressFinalize()? quizás llamando a GC.SupressFinalize() antes de ingresar al ciclo?

ideas, si no en la respuesta a la pregunta poco clara, más en cuanto a lo que podrían haber estado buscando?

+3

por cualquier medio se trata de una pregunta de la entrevista curioso - mientras que en conocimiento de la profundidad sobre el GC es un área válida para meterse en general, no sé qué le mostrará al entrevistador cualquier respuesta a esta pregunta en particular (además del hecho de que usted sabe que hay un solo hilo que realiza llamadas de finalización) – BrokenGlass

Respuesta

8

Es bastante inmaterial lo que sucede. El CLR dará por terminado el programa, hay un tiempo de espera de 2 segundos en un finalizador.

+7

¿Dónde está esto? documentado? – Oded

+2

@Oded - CLR de Richter a través de C#, página 478 de acuerdo con esta publicación del blog: http://nitoprograms.blogspot.com/2009/08/finalizers-at-process-exit.html –

+7

No puedo reproducir este tiempo de espera del finalizador en una aplicación de consola, parece funcionar felizmente - el enlace de arriba solo parece referirse a finalizadores ejecutados en el tiempo de salida del proceso – BrokenGlass

0

puede comprobar el estado dispuesta del objeto utilizando una variable booleana que ayudará al método dispose de entrar en un bucle infinito

class SomeClass : IDisposable 
{ 

    bool _disposed = false; 

    public void Dispose() 
    { 
     while (true && !_disposed) 
     { 
      _disposed = true; 
      Console.WriteLine("disposed"); 
     } 
    } 

    ~SomeClass() 
    { 
     Dispose(); 
    } 
}