2016-11-22 8 views
6

क्या Azure कार्य में ICollector<T> और IAsyncCollector<T> के बीच अंतर जब सी # कार्यों (भी WebJobs पर लागू होता है) लिख रहा है?Azure कार्य: ICollector <T> बनाम IAsyncCollector <T>

मैं नमूने से समझता हूं कि ये इंटरफेस हैं जो मैं आउटपुट बाइंडिंग में फ़ंक्शन पैरामीटर को बांधने के लिए उपयोग कर सकता हूं। मैं यह भी समझता हूं कि दो इंटरफेस में तदनुसार गैर-एसिंक और एसिंक विधि हस्ताक्षर हैं (यानी ICollector<T>.Add(item) और IAsyncCollector<T>.AddAsync(item))। लेकिन वे कवर के तहत क्या करते हैं? क्या वे वास्तव में आउटपुट बाध्यकारी में डेटा पोस्ट करते हैं, या यह आंतरिक निष्पादन के अंत में आंतरिक रूप से buffered और flushed है (इस मामले में, AddAsync विधि द्वारा क्यों होगा)?

उत्तर

10

ICollector<T>.Add(item) हमेशा अंतर्निहित सेवा तुरंत के खिलाफ ऐड आपरेशन प्रदर्शन करेंगे। जैसे कतार बाध्यकारी के लिए कार्यान्वयन संदेशों को तुरंत जोड़ देगा क्योंकि वे जोड़े गए हैं।

IAsyncCollector<T>.AddAsync(item) व्यवहार बाध्यकारी, पर अंतर्निहित सेवा बैचिंग का समर्थन करता है या नहीं इसके आधार के लिए बाध्य से भिन्न होता है। ऐसे मामलों में, AddAsync केवल को के साथ IAsyncCollector<T>.FlushAsync विधि द्वारा जोड़ा गया आइटमों को वास्तव में सहेज सकता है। जब कोई फ़ंक्शन सफलतापूर्वक पूरा हो जाता है FlushAsync स्वचालित रूप से कॉल किया जाएगा। आप ऑटो-फ्लश व्यवहार को आपके लिए फ्लश करने की अनुमति दे सकते हैं, या आप अपने फ़ंक्शन में मैन्युअल रूप से FlushAsync पर कॉल करना चुन सकते हैं।

बैचिंग बाध्यकारी को अंतर्निहित सेवा के साथ सबसे प्रभावी तरीके से बातचीत करने की अनुमति दे सकती है। जैसे Azure टेबल्स के लिए, एक ही बैच ऑपरेशन में एकाधिक इकाइयों को अद्यतन/जारी किया जा सकता है।

+0

सिवाय इसके कि यह अधिकांश बाइंडिंग की तरह दिखता है बैचिंग का समर्थन न करें (https://github.com/Azure/azure-webjobs-sdk/issues/921 देखें)। सेवाबस उदाहरण के लिए बैच नहीं करता है! – Ronnie

संबंधित मुद्दे