public async Task <IAsyncEnumerable <TKey> > CreateKeyEnumerableAsync(ITransaction tx, EnumerationMode enumerationMode, TimeSpan timeout, CancellationToken cancellationToken) { var keys = new System.Collections.Generic.List <TKey>(); try { BeginTransaction(tx); foreach (var key in Dictionary.Keys) { await LockManager.AcquireLock(tx.TransactionId, key, LockMode.Default, timeout, cancellationToken); keys.Add(key); } if (enumerationMode == EnumerationMode.Ordered) { keys.Sort(); } IAsyncEnumerable <TKey> result = new MockAsyncEnumerable <TKey>(keys); return(result); } catch { foreach (var key in keys) { LockManager.ReleaseLock(tx.TransactionId, key); } throw; } }
public TransactedConcurrentDictionary(Uri uri, Func <DictionaryChange, bool> changeCallback) : base(uri) { Dictionary = new ConcurrentDictionary <TKey, TValue>(); LockManager = new LockManager <TKey, long>(); OnDictionaryChanged = changeCallback; }
public TransactedConcurrentDictionary(Uri uri, EventHandler <DictionaryChangedEvent <TKey, TValue> > changeCallback = null) : base(uri) { Dictionary = new ConcurrentDictionary <TKey, TValue>(); LockManager = new LockManager <TKey, long>(); if (changeCallback != null) { InternalDictionaryChanged += changeCallback; } }
public async Task <IAsyncEnumerable <System.Collections.Generic.KeyValuePair <TKey, TValue> > > CreateEnumerableAsync(ITransaction tx, Func <TKey, bool> filter, EnumerationMode enumerationMode) { var keys = new System.Collections.Generic.List <TKey>(); try { BeginTransaction(tx); foreach (var key in Dictionary.Keys) { if (filter == null || filter(key)) { await LockManager.AcquireLock(tx.TransactionId, key, LockMode.Default); keys.Add(key); } } if (enumerationMode == EnumerationMode.Ordered) { keys.Sort(); } IAsyncEnumerable <System.Collections.Generic.KeyValuePair <TKey, TValue> > result = new MockAsyncEnumerable <System.Collections.Generic.KeyValuePair <TKey, TValue> >(keys.Select(k => new System.Collections.Generic.KeyValuePair <TKey, TValue>(k, Dictionary[k]))); return(result); } catch { foreach (var key in keys) { LockManager.ReleaseLock(tx.TransactionId, key); } throw; } }