public bool FindRemoveIf(FindIfRemove del, out KeyValuePair <TKey, TValue> kvpout) { var kout = default(KeyValuePair <TKey, TValue>); bool s = m_RwLock.AcquireReaderLock(() => { foreach (var kvp in m_Dictionary) { if (!del(kvp.Key, kvp.Value)) { continue; } bool s2 = m_RwLock.UpgradeToWriterLock(() => { if (m_Dictionary.ContainsKey(kvp.Key)) { m_Dictionary.Remove(kvp.Key); kout = kvp; return(true); } return(false); }); if (s2) { return(s2); } } return(false); }); kvpout = kout; return(s); }
public bool FindRemoveIf(FindIfRemove del, out KeyValuePair <TKey, TValue> kvpout) { var kout = default(KeyValuePair <TKey, TValue>); bool s = m_RwLock.AcquireReaderLock(() => { foreach (KeyValuePair <TKey, TValue> kvp in m_Dictionary) { if (!del(kvp.Key, kvp.Value)) { continue; } LockCookie lc = m_RwLock.UpgradeToWriterLock(-1); try { if (m_Dictionary.ContainsKey(kvp.Key)) { m_Dictionary.Remove(kvp.Key); kout = kvp; return(true); } } finally { m_RwLock.DowngradeFromWriterLock(ref lc); } } return(false); }); kvpout = kout; return(s); }