Ho la seguente classe. Ora a volte l'istruzione lock lancia un ArgumentNullException
, e in quel caso posso quindi vedere nel debugger che l'oggetto disposelock
è veramente nullo.I campi di sola lettura diventano nulli quando si eliminano dal finalizzatore
Come posso vedere che lo smaltimento è falso, so che il metodo è attivato da Finalizer.
Ma come può accadere? È definito come readonly e ottiene il suo valore quando viene creato l'oggetto.
PS: So che questo non è un buon modello, ma la sua parte di un dato codice, e ho appena non può spiegare il motivo per cui questo diventa nullo
public abstract class DisposableMarshalByRefObject : MarshalByRefObject, IDisposable
{
private readonly object disposeLock = new object();
/// </summary>
~DisposableMarshalByRefObject()
{
Dispose(false);
}
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool disposing) //disposing = false,=> finalizer
{
lock (disposeLock) //ArgumentNull Exception !
{
....
}
}
}
Mostrare un programma breve ma completo che mostri il problema. Questo mi sembra molto carino. –
C'è un finalizzatore? Forse l'oggetto era già disposto ed è necessario sopprimere la finalizzazione – ehh
Non riesco a riprodurlo in un piccolo programma. Principalmente mi chiedo se possa essere un comportamento atteso che il processo di finalizzazione possa annullare i riferimenti di sola lettura prima che il finalizzatore sia stato completato –