8

मुझे Difference between […]Async and Begin[…] .net asynchronous APIs प्रश्न मिला लेकिन this answer मुझे थोड़ा उलझन में डाल दिया।सॉकेट प्रोग्रामिंग पर एपीएम, ईएपी और टीपीएल

इन पैटर्न के बारे में बात करते हुए स्टीफन ने कहा:

अधिकांश * Async तरीकों (इसी * पूरे घटनाओं के साथ) घटना-आधारित अतुल्यकालिक पैटर्न का उपयोग कर रहे हैं। पुराना (लेकिन अभी भी पूरी तरह से वैध) शुरू * और अंत * एक पैटर्न है जिसे असीमित प्रोग्रामिंग मॉडल कहा जाता है।

सॉकेट क्लास इस नियम का अपवाद है; इसकी * Async विधियों में कोई संबंधित घटना नहीं है; यह अनिवार्य रूप से अत्यधिक स्मृति आवंटन से बचने के लिए एपीएम किया जाता है।

मुझे इसे उपयोग करने के रूप में मिलता है * कम से कम जब सॉकेट की बात आती है तो Async विधियां अधिक कुशल होती हैं।

हालांकि, दोनों एपीएम और EBAP टास्क समानांतर लाइब्रेरी के आधार पर एक और अधिक लचीला दृष्टिकोण के साथ प्रतिस्थापित किया जा रहा है: लेकिन फिर वह टास्क समानांतर लाइब्रेरी का उल्लेख किया। चूंकि टीपीएल आसानी से एपीएम लपेट सकता है, इसलिए पुराने वर्गों को सीधे अपडेट नहीं किया जाएगा; पुरानी एपीएम विधियों के लिए कार्य समकक्ष प्रदान करने के लिए विस्तार विधियों का उपयोग किया जाता है।

मैं MSDN पर TPL and Traditional .NET Asynchronous Programming पाया, मैं TPL की मूल बातें पता है, कार्य, रद्दीकरण, निरंतरता, आदि बनाने लेकिन मैं अभी भी इन को समझने में विफल:

क्या अतुल्यकालिक प्रोग्रामिंग मॉडल के फायदे हैं (एपीएम) और एक दूसरे की तुलना में घटना आधारित असीमित पैटर्न (ईएपी)? टीपीएल आसानी से एपीएम को लपेट सकता है का मतलब है कि एपीएम और ईएपी टीपीएल के साथ प्रतिस्थापित किया जा रहा है?

और सबसे महत्वपूर्ण बात: मुझे सॉकेट प्रोग्रामिंग में किस का उपयोग करना चाहिए;

  • एपीएम?
  • ईएपी?
  • एपीएम या ईएपी एक कार्य द्वारा लिपटे?
  • कार्य में सॉकेट वर्ग के अवरुद्ध तरीकों का उपयोग करके टीपीएल?
  • अन्य?
+0

इसे देखें: http://stackoverflow.com/questions/5834755/turning-async-socket-parallel-and-not-only-concurrent- इन-गहन-आवेदक –

उत्तर

6

TPL कैसे लपेट कर सकते हैं करता APMs आसानी से मतलब है कि दोनों एपीएम और ईएपी TPL के साथ प्रतिस्थापित किया जा रहा है?

ऐसा नहीं है। गीलेर एपीएम और ईएपी को टीएपी (टास्क एसिंक्रोनस पैटर्न) द्वारा प्रतिस्थापित किया जाएगा या नए एपीआई में इसके साथ कुछ लेना देना नहीं है। मैं उम्मीद करता हूं कि विभिन्न कारणों से टीएपी एपीएम और ईएपी को प्रतिस्थापित करेगी। मेरा मुख्य कारण यह है कि टीएपी का उपयोग करने के लिए जो कोड आप लिखते हैं वह बहुत बेहतर होता है। .ContinueWith(/* ... */).ContinueWith(/* ... */) करना आम तौर पर उस कोड से अधिक बेहतर पढ़ता है जिसे आपको प्रारंभ/समाप्ति विधियों के माध्यम से चेन एसिंक कॉल पर लिखने की आवश्यकता होगी, भले ही आप जारी रखने के विकल्पों को ध्यान में रख सकें, यह निर्धारित करने के लिए कि निरंतरता चलनी चाहिए या नहीं। टीपीएल कार्य के लिए विभिन्न संयोजक भी प्रदान करता है, जैसे WaitAll और WaitAny, जो कुछ परिदृश्यों को अधिक आसान बना सकते हैं। एसिंक/प्रतीक्षा कीवर्ड के माध्यम से सी # और वीबी.नेट में आने वाली भाषा समर्थन यह और भी आसान बना देगा।

नल में APMs रैप करने के लिए सक्षम होने के नाते, क्योंकि यह मतलब है कि आप इसे नए मॉडल में फिट बनाने के लिए मौजूदा कोड को फिर से लिखने की जरूरत नहीं है यह आसान इस पद्धति को स्विच करने के लिए बनाता है।

कौन सा मैं सॉकेट प्रोग्रामिंग में इस्तेमाल करना चाहिए?

मैं सॉकेट पर एपीएम विधियों को लपेटने के लिए टीएपी का उपयोग करने की सलाह दूंगा। जब तक आप यह साबित नहीं कर सकते कि स्टार्ट/एंड विधियों को एक कार्य में लपेटने का अतिरिक्त ओवरहेड स्केलेबल/तेज़ पर्याप्त या नहीं है, तो मैं टीएपी के कोडिंग की आसानी का लाभ उठाऊंगा।

3

गिडोन का एक अच्छा जवाब था; मैं बस कुछ और पृष्ठभूमि प्रदान करना चाहता था:

असीमित प्रोग्रामिंग मॉडल (एपीएम) और घटना-आधारित असिंक्रोनस पैटर्न (ईएपी) के फायदे एक-दूसरे की तुलना में क्या फायदे हैं?

एपीएम अधिक आम है और इसमें एक सुंदर सख्ती से परिभाषित पैटर्न है। उदाहरण के लिए, टीपीएल में एपीएम विधियों (TaskFactory.FromAsync) के लिए सामान्य रैपर हैं, लेकिन यह ईएपी के लिए ऐसा नहीं कर सकता क्योंकि ईएपी सख्ती से परिभाषित नहीं है।

ईएपी का एक बड़ा फायदा है: ईवेंट कॉलबैक आपके लिए थ्रेड मार्शलिंग को संभालता है। इसलिए वे वास्तव में अच्छे हैं, उदाहरण के लिए, यूआई के लिए मूल पृष्ठभूमि संचालन (BackgroundWorker)। डिफ़ॉल्ट और एक सख्ती से परिभाषित, आम पैटर्न से स्वत: धागा marshaling:

नल दोनों दुनिया के सर्वश्रेष्ठ को जोड़ती है। यह एक एसिंक्रोनस ऑपरेशन (Task) के लिए एक अच्छा ऑब्जेक्ट प्रतिनिधित्व भी है।

"टीपीएल आसानी से एपीएम कैसे लपेट सकता है" का अर्थ है कि "एपीएम और ईएपी दोनों को टीपीएल के साथ बदल दिया जा रहा है"?

ऐसा नहीं है।

"हालांकि, दोनों एपीएम और EBAP टास्क समानांतर लाइब्रेरी के आधार पर एक और अधिक लचीला दृष्टिकोण के साथ प्रतिस्थापित किया जा रहा है।" - जिसका अर्थ है कि नए कोड को एपीएम/ईएपी विधियों/घटनाओं को शामिल करने की आवश्यकता नहीं है; नए कोड में इसके बजाय टीएपी विधियों को शामिल करना चाहिए।

"जब से TPL आसानी से APMs लपेट कर सकते हैं, बड़े वर्गों की संभावना नहीं सीधे अपडेट कर दिया जाएगा, विस्तार के तरीकों वर्ष एपीएम तरीकों के लिए टास्क समकक्ष प्रदान करने के लिए उपयोग किया जाता है।" - जिसका अर्थ है कि आप TaskFactory.FromAsync का उपयोग कर मौजूदा एपीएम प्रकार में टीएपी विधियों को जोड़ सकते हैं; मुझे लगा कि टीपीएल टीम बीसीएल में कक्षाओं के एक टन को संशोधित करने के बजाय इस दृष्टिकोण को ले जाएगी। हालांकि, मैं इस अनुमान में गलत था। प्रदर्शन कारणों से, बीसीएल/टीपीएल टीम ने पूरे ढांचे की समीक्षा की और विस्तार विधियों का उपयोग करने के बजाय सीधे .NET कक्षाओं में टीएपी विधियों को जोड़ा। नई टीएपी विधियों को .NET 4.5 में शामिल किया गया है, जल्द ही आ रहा है ...

+1

टीएपी अपने आप से थ्रेड मार्शलिंग नहीं करता है। लेकिन 'प्रतीक्षा' के साथ संयोजन में टीएपी करता है। – svick

+1

मुझे लगता है कि यह "टीएपी" की परिभाषा पर निर्भर करता है। मैं टीएपी में 'async' और 'प्रतीक्षा' शामिल करता हूं। –

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