Example #1
0
        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);
        }
Example #2
0
        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());
         }
     }
 }