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