private void HandleRemoveResourceRequest(RemoveResourceRequestMessage removeResourceRequest) { var result = TryGetResource(out var resource); if (result) { Interlocked.Decrement(ref _numResources); // We won't return this to the pool, so decrement. } removeResourceRequest.TaskCompletionSource.SetResult((result, resource)); }
public bool TryRemove(out TResource resource) { var taskCompletionSource = new TaskCompletionSource <(bool Result, TResource Resource)>(); var request = new RemoveResourceRequestMessage(taskCompletionSource); if (!_messageHandler.Post(request)) { taskCompletionSource.SetException(GetObjectDisposedException()); } // We can wait synchronously for the Task Result because RemoveResourceRequestMessage // will always be handled immediately by the ActionBlock. bool result; (result, resource) = taskCompletionSource.Task.Result; return(result); }