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