/// <inheritdoc />
        public async Task <Task <EventData> > RunAsync(EventData data, IConcurrencyPolicy.ProcessData processor, object state, CancellationToken cancellationToken)
        {
            Task <EventData> executionTask = null;

            await _runControl.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                if (Interlocked.Read(ref _executingTaskCount) <= Capacity)
                {
                    var partition = _partitioner.GetPartition(data);
                    if (!_partitioner.IsCaseSensitive)
                    {
                        partition = partition.ToLowerInvariant();
                    }

                    if (_partitionTracker.TryAdd(partition, partition))
                    {
                        Interlocked.Increment(ref _executingTaskCount);
                        executionTask = processor(data, state, cancellationToken);
                        _             = executionTask.ContinueWith(t =>
                        {
                            _partitionTracker.TryRemove(partition, out _);
                            Interlocked.Decrement(ref _executingTaskCount);
                        });
                    }
                }
            }
            finally
            {
                _runControl.Release();
            }

            return(executionTask);
        }
        /// <inheritdoc />
        public async Task <Task <EventData> > RunAsync(EventData data, IConcurrencyPolicy.ProcessData processor, object state, CancellationToken cancellationToken)
        {
            Task <EventData> executionTask = null;

            await _runControl.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                if (Interlocked.Read(ref _executingTaskCount) <= Capacity)
                {
                    Interlocked.Increment(ref _executingTaskCount);
                    executionTask = processor(data, state, cancellationToken);
                    _             = executionTask.ContinueWith(t => Interlocked.Decrement(ref _executingTaskCount));
                }
            }
            finally
            {
                _runControl.Release();
            }

            return(executionTask);
        }
        /// <inheritdoc />
        public async Task <Task <EventData> > RunAsync(EventData data, IConcurrencyPolicy.ProcessData processor, object state, CancellationToken cancellationToken)
        {
            Task <EventData> executionTask = null;

            await _runControl.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                if (_trackedTask == null)
                {
                    executionTask = processor(data, state, cancellationToken);
                    _trackedTask  = executionTask;
                    _             = _trackedTask.ContinueWith(t => _trackedTask = null);
                }
            }
            finally
            {
                _runControl.Release();
            }

            return(executionTask);
        }