Я заметил, что некоторые классы на MSDN (like this one), которые имеют Disposing
событие со следующим комментарием:Можете ли вы запустить событие «Disposing», если Dispose() вызывается финализатором?
Происходит при Dispose вызывается или, когда этот объект будет завершен и собраны сборщиком мусора.
Я хочу реализовать свое собственное событие Disposing
в моем классе. Вот моя основная реализация (following the best practices for the dispose pattern):
public abstract class Handle : IDisposable
{
public bool Disposed { get; private set; }
public event System.Action DisposingCompleted;
public Handle()
{
Disposed = false;
}
~Handle()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing = false)
{
if (Disposed)
{
return;
}
if (disposing)
{
HandleManagedResources();
}
HandleUnManagedResources();
Disposed = true;
if (DisposingCompleted != null)
{
DisposingCompleted();
}
}
protected virtual void HandleManagedResources() {}
protected virtual void HandleUnManagedResources() {}
}
Кто-то упомянул о моем обзоре кода, что они не уверены в том или не стрелять безопасно событие, как это потому, что Dispose()
может вызываться из финализации, но, в соответствии с комментарии к этой ссылке MSDN, которую я добавил наверху, ясно, что есть объекты, запускающие события, когда они выбраны или завершены.
Я что-то упустил или это безопасно? Как GraphicsDevice реализовать событие, которое уволено из распоряжения ИЛИ при завершении? Если ответ просто «Нет, вы не можете этого делать никогда», тогда есть ли другой способ достижения такого же эффекта? (Событие для объекта расположены ИЛИ завершена)
Вы должны использовать стандартную предлагаемую реализацию и шаблон, например, именования и условные обозначения, вместо того, чтобы кататься самостоятельно. В частности, вы должны использовать 'bool disposing' вместо' bool fromFinalizer'. –
@ LasseV.Karlsen Конечно, я изменил имена вокруг. – Foggzie
Возможно, вы захотите прочитать сообщение Эрика Липперса о всех странностях, которые могут произойти в финализаторах. Http://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/ – juharr