У меня есть следующий класс. Теперь иногда оператор блокировки бросает ArgumentNullException
, и в этом случае я могу увидеть в отладчике, что объект disposelock
действительно имеет значение null.
Как я вижу, что утилизация ложна, я знаю, что метод запускается из Finalizer.
Но как это может произойти? Он определяется как readonly и получает его значение при создании объекта.
PS: Я знаю, что это не очень хороший шаблон, но его часть данного кода, и я просто не могу объяснить, почему это становится null
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 !
{
....
}
}
}