Вот пример, о котором я не уверен:Как правильно распоряжаться сбором неуправляемых ресурсов из финализатора?
public class SomeClass : IDisposable {
~SomeClass() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
private bool _disposed;
protected virtual void Dispose(bool disposing) {
if (!_disposed) {
if (disposing) {
// TODO: Release any managed resources here...
}
// ?! Is it safe to enumerate the dictionary here ?!
foreach (var resource in _resources.Values)
ReleaseBuffer(resource);
_resources = null;
_disposed = true;
}
}
private Dictionary<string, IntPtr> _resources;
...
}
Будет ли это безопасно перечислить управляемый словарь для того, чтобы освободить неуправляемые ресурсы?
Является ли наличие неопределенного словаря, поскольку порядок, в котором вызывается финализатор, не определен?
Вот цитата взята из MSDN, которую я считаю запутанным [1]:
- В финализаторах двух объектов не гарантируют выполнение в любом определенном порядке, даже если один объект относится к Другие. То есть, если объект A имеет ссылку на объект B, и оба имеют финализаторы, объект B может быть уже завершен, когда начинается финализатор объекта A.
Должен быть безопасным, словарь - это управляемый объект, внедренный в экземпляр вашего класса, и он будет доступен до тех пор, пока не будет вызван финализатор. См. Http://stackoverflow.com/questions/13954829/gc-collect-and-finalize. – galenus
'Словарь' не имеет финализатора. Так что ты в безопасности. – Blorgbeard
@Blorgbeard: Словарь не является потокобезопасным, и ничего не гарантируется в контексте потоков, в котором запущен финализатор. – supercat