2012-02-23 17 views
5

Korzystanie dataflow CTP (w TPL)Jak wywołać funkcję TriggerBatch automagicznie po przekroczeniu limitu czasu, jeśli liczba elementów oczekujących w kolejce jest mniejsza niż rozmiar BatchSize?

Czy istnieje sposób, aby wywołać BatchBlock.TriggerBatch automatycznie, gdy liczba aktualnie w kolejce lub przełożony elementów jest mniejsza niż BatchSize, po przekroczeniu limitu czasu?

I lepiej: ten czas powinien zostać zresetowany do 0 za każdym razem, gdy blok otrzymuje nowy przedmiot.

Odpowiedz

12

Tak, można to osiągnąć dość elegancko, łącząc bloki. W tym przypadku chcesz ustawić TransformBlock, który łączysz "przed" BatchBlock. To wyglądałoby mniej więcej tak:

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); 
Powiązane problemy