private async Task <bool> SafeAddOrReplaceWithMerging(TKey key, IAsyncCacheData <TKey, TValue> data, CancellationToken token) { var dbdata = await _keyBasedFetcher.GetAsync(key, token).ConfigureAwait(false); if (dbdata == null || dbdata.Count == 0) { return(false); } TValue value; if (dbdata.Count == 1) { value = dbdata[0].Value; data.AddOrReplace(key, value); } else { value = dbdata[0].Value; for (var i = 1; i < dbdata.Count; i++) { TValue outVal; if (dbdata[i].MergeCurrentDataForKeyConflict(value, out outVal)) { value = outVal; } } data.AddOrReplace(key, value); } return(true); }
private async Task <bool> SafeAddOrReplaceWithoutMerging(TKey key, IAsyncCacheData <TKey, TValue> data, CancellationToken token) { var hasRow = await _keyBasedFetcher.HasRowAsync(key, token).ConfigureAwait(false); if (!hasRow) { return(false); } data.AddOrReplace(key, default(TValue)); return(true); }
internal override void Merge(IAsyncCacheData <TKey, TValue> target, CancellationToken token) { for (var i = 0; i < SyncRoots.Length; i++) { var syncRoot = SyncRoots[i]; lock (syncRoot) { token.ThrowIfCancellationRequested(); target.AddOrReplace(_data[i].AsEnumerable()); } } }