/// <summary>
        /// Instantiates the <see cref="DiskStorageCache"/>.
        /// </summary>
        public DiskStorageCache(
            IDiskStorage diskStorage,
            IEntryEvictionComparatorSupplier entryEvictionComparatorSupplier,
            Params parameters,
            ICacheEventListener cacheEventListener,
            ICacheErrorLogger cacheErrorLogger,
            IDiskTrimmableRegistry diskTrimmableRegistry,
            bool indexPopulateAtStartupEnabled,
            Clock clock = null)
        {
            _lowDiskSpaceCacheSizeLimit = parameters.LowDiskSpaceCacheSizeLimit;
            _defaultCacheSizeLimit      = parameters.DefaultCacheSizeLimit;
            _cacheSizeLimit             = parameters.DefaultCacheSizeLimit;
            _statFsHelper = StatFsHelper.Instance;

            _storage = diskStorage;

            _entryEvictionComparatorSupplier = entryEvictionComparatorSupplier;

            _cacheSizeLastUpdateTime = default(DateTime);

            _cacheEventListener = cacheEventListener;

            _cacheSizeLimitMinimum = parameters.CacheSizeLimitMinimum;

            _cacheErrorLogger = cacheErrorLogger;

            _cacheStats = new CacheStats();

            if (diskTrimmableRegistry != null)
            {
                diskTrimmableRegistry.RegisterDiskTrimmable(this);
            }

            _clock = clock ?? SystemClock.Get();

            _indexPopulateAtStartupEnabled = indexPopulateAtStartupEnabled;

            _resourceIndex = new HashSet <string>();

            if (_indexPopulateAtStartupEnabled)
            {
                Task.Run(() =>
                {
                    try
                    {
                        lock (_lock)
                        {
                            MaybeUpdateFileCacheSize();
                        }
                    }
                    finally
                    {
                        _countdownEvent.Signal();
                    }
                });
            }
            else
            {
                _countdownEvent.Reset(0);
            }
        }