internal static void UnregisterAmbientManager(StyleManagerAmbient ambientProvider) { LockCookie cookie1 = new LockCookie(); bool readerLockHeld = StyleManager._ReadWriteAmbientListLock.IsReaderLockHeld; if (readerLockHeld) { cookie1 = StyleManager._ReadWriteAmbientListLock.UpgradeToWriterLock(-1); } else { StyleManager._ReadWriteAmbientListLock.AcquireWriterLock(-1); } try { foreach (WeakReference item in _RegisteredAmbients) { object target = item.Target; if (target != null && target.Equals(ambientProvider)) { _RegisteredControls.Remove(item); break; } } } finally { if (readerLockHeld) { StyleManager._ReadWriteAmbientListLock.DowngradeFromWriterLock(ref cookie1); } else { StyleManager._ReadWriteAmbientListLock.ReleaseWriterLock(); } } }
private static WeakReference GetAmbientReference(StyleManagerAmbient ambientProvider) { ArrayList registeredAmbients = _RegisteredAmbients; if (registeredAmbients == null) return null; StyleManager._ReadWriteAmbientListLock.AcquireReaderLock(-1); try { foreach (WeakReference item in registeredAmbients) { object target = item.Target; if (target != null && target.Equals(ambientProvider)) return item; } } finally { StyleManager._ReadWriteAmbientListLock.ReleaseReaderLock(); } return null; }
internal static void RegisterAmbientManager(StyleManagerAmbient ambientProvider) { if (GetAmbientReference(ambientProvider) == null) { WeakReference reference = new WeakReference(ambientProvider); LockCookie cookie1 = new LockCookie(); bool readerLockHeld = StyleManager._ReadWriteAmbientListLock.IsReaderLockHeld; if (readerLockHeld) { cookie1 = StyleManager._ReadWriteAmbientListLock.UpgradeToWriterLock(-1); } else { StyleManager._ReadWriteAmbientListLock.AcquireWriterLock(-1); } try { _RegisteredAmbients.Add(reference); } finally { if (readerLockHeld) { StyleManager._ReadWriteAmbientListLock.DowngradeFromWriterLock(ref cookie1); } else { StyleManager._ReadWriteAmbientListLock.ReleaseWriterLock(); } } ambientProvider = null; } }