2012-02-23 14 views
5

Dataflow सीटीपी (TPL में)कतारबद्ध वस्तुओं की संख्या बैचसाइज से कम है, तो एक टाइमआउट के बाद स्वचालित रूप से TriggerBatch को कैसे कॉल करें?

वहाँ एक रास्ता BatchBlock.TriggerBatch स्वचालित रूप से कॉल करने के लिए करता है, तो वर्तमान में पंक्तिबद्ध या स्थगित कर दिया मदों की संख्या BatchSize से कम है, एक समय समाप्ति के बाद है का उपयोग करते हुए?

और बेहतर: जब भी ब्लॉक को एक नया आइटम प्राप्त होता है तो यह टाइमआउट 0 पर रीसेट किया जाना चाहिए।

उत्तर

12

हां, आप ब्लॉकों को एक साथ जोड़कर इसे सुंदर ढंग से पूरा कर सकते हैं। इस मामले में आप एक ट्रांसफॉर्मब्लॉक सेट करना चाहते हैं जिसे आप बैचब्लॉक से पहले "पहले" लिंक करते हैं। ऐसा कुछ ऐसा दिखाई देगा:

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);