Exemple #1
0
        async void cleanLoop()
        {
            await ThreadingUtils.ContinueAtDedicatedThread();

            while (true)
            {
                try
                {
                    CacheEntry[] entries;
                    using (await _storage.LockAsync())
                    {
                        entries = _storage.Entries.ToArray();
                    }

                    var entriesToRemove = new List <CacheEntry>();
                    var actualSize      = entries.Sum(e => e.ApproximateSizeInMemory);
                    if (actualSize > _maxCacheSize)
                    {
                        var delta = _maxCacheSize - _maxCacheSize;
                        foreach (var entry in entries.Shake(new Random()))
                        {
                            delta -= entry.ApproximateSizeInMemory;
                            entriesToRemove.Add(entry);

                            if (delta <= 0)
                            {
                                break;
                            }
                        }
                    }

                    foreach (var entry in entriesToRemove)
                    {
                        await _storage.TryRemoveAsync(entry);
                    }
                }
                catch { }
                finally
                {
                    await Task.Delay(1 * 60 * 1000);
                }
            }
        }