以下是有關這我不清楚一個例子:如何正確處理來自終結器的非託管資源的收集?
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的引用並且都具有終結器,則在對象A的終結器開始時,對象B可能已經完成。
它應該是安全的,字典是一個管理對象,根植於您的類的實例,它將被訪問,直到調用終結器。請參閱http://stackoverflow.com/questions/13954829/gc-collect-and-finalize。 – galenus 2014-10-30 19:42:24
'Dictionary'沒有終結符。所以你很安全。 – Blorgbeard 2014-10-30 19:43:41
@Blorgbeard:字典不是線程安全的,對於運行終結器的線程上下文沒有任何保證。 – supercat 2014-10-31 20:24:27