2012-01-11 19 views
6

mi sono imbattuto in una domanda intervista, che non sapevo la risposta (piccolo aiuto :)) bene dichiarato qualcosa del genere:Finalizer bloccato in loop infinito

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

    ~SomeClass() 
    { 
     Dispose(); 
    } 
} 

1) Ha l'oggetto ottenere finalizzato quando non si fa più riferimento dopo il prossimo GC? La mia risposta è stata NO, perché il thread di finalizzazione sarà bloccato sul loop infinito.

2) Che cosa potrebbe essere fatto nel Dispose per terminare la messa a punto e quante volte sarà il ciclo continuerà prima che l'oggetto è disposto (con fuori tenendo in considerazione il tempo che trascorrerà nella prossima Gen)

io non sono particolarmente chiara della domanda esatta (2) .I po 'a corto di tempo ...

non conoscendo la risposta ho messo un contatore statico che arriva a 3 e chiamate rompono e ha dichiarato 3 che tecnicamente sarebbe lavoro :), ma questa non è la risposta

Sto indovinando come qualcosa a che fare con GC .SupressFinalize()? forse chiamando GC.SupressFinalize() prima di entrare nel ciclo?

eventuali idee se non sulla risposta alla domanda poco chiara, più su ciò che potrebbero essere di mira?

+3

con qualsiasi mezzo questa è una questione intervista curiosa - mentre conoscenza approfondita riguardo al GC è un'area valida da attingere in generale, non so quale risposta a questa particolare domanda mostrerà all'intervistatore (oltre al fatto che sai che esiste un thread singolo che esegue le chiamate di finalizzazione) – BrokenGlass

risposta

8

È piuttosto irrilevante cosa succede. Il CLR terminerà il programma, c'è un timeout di 2 secondi su un finalizzatore.

+7

Dove è questo documentata? – Oded

+2

@Oded - Richter's CLR tramite C#, pagina 478 in base a questo post del blog: http://nitoprograms.blogspot.com/2009/08/finalizers-at-process-exit.html –

+7

Non riesco a ripeterlo nel timeout del finalizzatore in un'app per console sembra funzionare felicemente - il collegamento sopra sembra solo fare riferimento ai finalizzatori eseguiti all'ora di uscita del processo – BrokenGlass

0

è possibile verificare lo stato disposto dell'oggetto utilizzando una variabile booleana che aiuterà il metodo dispose di entrare in un ciclo infinito

class SomeClass : IDisposable 
{ 

    bool _disposed = false; 

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

    ~SomeClass() 
    { 
     Dispose(); 
    } 
}