/// <summary>
        /// Periodically purge expired resources from _availableResources
        /// </summary>
        private async void SetupPeriodicPurge()
        {
            if (_resourcesExpireAfter != null)
            {
                using (var purgeCancellationTokenSource = new CancellationTokenSource())
                {
                    var purgeCancellationToken = purgeCancellationTokenSource.Token;

#pragma warning disable 4014
                    Task.Run(async() =>
#pragma warning restore 4014
                    {
                        while (!purgeCancellationToken.IsCancellationRequested)
                        {
                            // Run the clean-up 10X as often as resources will expire. This will ensure that we
                            // keep the number of resources that have expired in the queue to a minimum.
                            const int frequency = 10;
                            await Task.Delay(new TimeSpan(_resourcesExpireAfter.Value.Ticks / frequency), purgeCancellationToken).ConfigureAwait(false);
                            var purgeMessage = new PurgeExpiredResourcesMessage();
                            _messageHandler.Post(purgeMessage);
                        }
                    }, purgeCancellationToken);

                    try
                    {
                        await _messageHandler.Completion.ConfigureAwait(false);
                    }
                    finally
                    {
                        purgeCancellationTokenSource.Cancel();
                    }
                }
            }
        }
        private void HandlePurgeExpiredResource(PurgeExpiredResourcesMessage purgeExpiredResourcesMessage)
        {
            var nonExpiredResources = new List <TimestampedResource>();

            while (_availableResources.Count > 0)
            {
                var timestampedResource = _availableResources.Dequeue();
                if (IsResourceExpired(timestampedResource))
                {
                    DisposeResource(timestampedResource.Resource);
                }
                else
                {
                    nonExpiredResources.Add(timestampedResource);
                }
            }

            foreach (var timestampedResource in nonExpiredResources)
            {
                _availableResources.Enqueue(timestampedResource);
            }

            _messageHandler.Post(new EnsureAvailableResourcesMessage());
        }