Как автоматически вызвать TriggerBatch после тайм-аута, если количество элементов в очереди меньше, чем BatchSize? - PullRequest
12 голосов
/ 23 февраля 2012

Использование CTP потока данных (в TPL)

Существует ли способ автоматического вызова BatchBlock.TriggerBatch, если количество находящихся в очереди или отложенных элементов меньше, чем BatchSize, после истечения времени ожидания?

И лучше: этот тайм-аут должен сбрасываться на 0 каждый раз, когда блок получает новый элемент.

1 Ответ

16 голосов
/ 24 февраля 2012

Да, вы можете сделать это довольно элегантно, связав вместе блоки.В этом случае вы хотите установить TransformBlock, который вы связываете «до» BatchBlock.Это будет выглядеть примерно так:

Timer triggerBatchTimer = new Timer(() => yourBatchBlock.TriggerBatch());

TransformBlock<T, T> timeoutTransformBlock = new TransformBlock<T, T>((value) =>
{
    triggerBatchTimer.Change(5000, Timeout.Infinite);

    return value; 
});

timeoutTransformBlock.LinkTo(yourBatchBlock);

yourBufferBlock.LinkTo(timeoutTransformBlock);
...