public void invalidate() { while (true) { lock (this) { for (int i = 0; i < table.Length; i++) { for (Entry e = table[i]; e != null; e = e.next) { IPersistent obj = (IPersistent)e.oref.Target; if (obj != null) { if (obj.IsModified()) { e.dirty = 0; obj.Invalidate(); } } else if (e.dirty != 0) { goto waitFinalization; } } table[i] = null; } count = 0; return; } waitFinalization: GC.WaitForPendingFinalizers(); } }