public async Task Execute(TEntry entry, CancellationToken cancellationToken) { var batchEntry = new BatchEntry <TEntry>(entry); await _channel.Writer.WriteAsync(batchEntry, cancellationToken).ConfigureAwait(false); await batchEntry.Completed.ConfigureAwait(false); }
async Task ReadBatch() { var batchToken = new CancellationTokenSource(_settings.Timeout); var batch = new List <BatchEntry <TEntry> >(); try { try { for (int entryId = 0, batchLength = 0; entryId < _settings.MessageLimit && batchLength < _settings.SizeLimit; entryId++) { BatchEntry <TEntry> entry = await _channel.Reader.ReadAsync(batchToken.Token).ConfigureAwait(false); batchLength += AddingEntry(entry.Entry, entryId.ToString()); batch.Add(entry); if (await _channel.Reader.WaitToReadAsync(batchToken.Token).ConfigureAwait(false) == false) { break; } } } catch (OperationCanceledException exception) when(exception.CancellationToken == batchToken.Token && batch.Count > 0) { } await _executor.Push(() => ExecuteBatch(batch)).ConfigureAwait(false); } catch (OperationCanceledException exception) when(exception.CancellationToken == batchToken.Token) { } catch (Exception exception) { foreach (BatchEntry <TEntry> entry in batch) { entry.SetFaulted(exception); } } finally { batchToken.Dispose(); } }