public bool TryGetExisting(out ReusableResource <TResource> reusableResource) { var taskCompletionSource = new TaskCompletionSource <ReusableResource <TResource> >(); var request = new ExistingResourceRequestMessage(taskCompletionSource); if (!_messageHandler.Post(request)) { taskCompletionSource.SetException(GetObjectDisposedException()); } // We can wait synchronously for the Task Result because ExistingResourceRequestMessage // will always be handled immediately by the ActionBlock. reusableResource = taskCompletionSource.Task.Result; return(reusableResource != null); }
private ReusableResource <TResource> TryGetReusableResource() { ReusableResource <TResource> reusableResource = null; while (_availableResources.Count > 0) { var timestampedResource = _availableResources.Dequeue(); var resource = timestampedResource.Resource; if (IsResourceExpired(timestampedResource)) { DisposeResource(resource); } else { reusableResource = GetReusableResource(resource); } } _messageHandler.Post(new EnsureAvailableResourcesMessage()); return(reusableResource); }