/// <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()); }