2012-02-23 14 views
5

Sử dụng Dataflow CTP (trong TPL)Làm thế nào để gọi TriggerBatch tự động sau một thời gian chờ nếu số lượng các mục được xếp hàng đợi ít hơn BatchSize?

Có cách nào để gọi BatchBlock.TriggerBatch tự động nếu số mục hiện đang xếp hàng hoặc bị trì hoãn ít hơn BatchSize, sau khi hết giờ?

Và tốt hơn: thời gian chờ này phải được đặt lại về 0 mỗi khi khối nhận được một mục mới.

Trả lời

12

Có, bạn có thể thực hiện điều này khá thanh lịch bằng cách ghép các khối lại với nhau. Trong trường hợp này bạn muốn thiết lập một TransformBlock mà bạn liên kết "trước" BatchBlock. Điều đó sẽ trông giống như sau:

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); 
Các vấn đề liên quan