/// <summary> /// Конструктор для создания <see cref="BatchingTarget{TItem}"/>. /// </summary> /// <param name="batchTarget">Цель, куда будет отправлена пачка.</param> /// <param name="batchSize">Размер пачки.</param> /// <param name="forceSendTimeout">Время по ситченеии которого элементы в буфере будут отправлены в цель, даже если <paramref name="batchSize"/> ещё не набран.</param> /// <param name="exceptionHandler">Обработчик искючений, которые могут возникнуть во время отправки пачки.</param> public BatchingTarget(ITarget <IReadOnlyCollection <TItem> > batchTarget, int batchSize, TimeSpan forceSendTimeout, IExceptionHandler exceptionHandler) { Contract.Requires <ArgumentNullException>(batchTarget != null); Contract.Requires <ArgumentException>(batchSize > 0); Contract.Requires <ArgumentException>(forceSendTimeout != TimeSpan.Zero); Contract.Requires <ArgumentNullException>(exceptionHandler != null); _batchTarget = batchTarget; _exceptionHandler = exceptionHandler; _pool = new BatchPool <TItem>(SendBatch, batchSize, forceSendTimeout); _completedTask = Task.FromResult(true); }
public void BatchPoolShouldFlushAddedItemsAfterTimeout() { const int itemCount = 5; var items = Enumerable.Range(0, itemCount); var flushedItems = new List <int>(); var batchPool = new BatchPool <int>(flushedItems.AddRange, itemCount - 1, TimeSpan.FromSeconds(0.2)); foreach (var item in items) { batchPool.Add(item); } var isSuccess = batchPool.WaitAsync().Wait(1000); Assert.True(isSuccess, "Не дождались результата"); Assert.AreEqual(items, flushedItems); }
public void BatchPoolShouldFlushAddedItemsWhenThresholdReached() { const int itemCount = 5; var items = Enumerable.Range(0, itemCount); var taskCancellationSource = new TaskCompletionSource <IReadOnlyCollection <int> >(); var batchPool = new BatchPool <int>(taskCancellationSource.SetResult, itemCount); foreach (var item in items) { batchPool.Add(item); } var isSuccess = taskCancellationSource.Task.Wait(1000); Assert.True(isSuccess, "Не дождались результата"); Assert.AreEqual(items, taskCancellationSource.Task.Result); }
public void BatchPoolShouldStopWaitWhenAllFlushOperationsIsEnded() { const int itemCount = 5; const int expectedFlushCount = 2; int flushCount = 0; var items = Enumerable.Range(0, itemCount * expectedFlushCount); var batchPool = new BatchPool <int>(o => Interlocked.Increment(ref flushCount), itemCount); foreach (var item in items) { batchPool.Add(item); } var isSuccess = batchPool.WaitAsync().Wait(1000); Assert.True(isSuccess, "Не дождались результата"); Assert.AreEqual(expectedFlushCount, flushCount); }