2012-02-14 12 views
7

मैं सी # का उपयोग करके एसिंक्रोनस प्रोग्रामिंग सीख रहा हूं और मैं आमतौर पर BeginInvoke का उपयोग करता हूं, लेकिन मुझे एसिंक्रोनस एप्लिकेशन बनाने के अन्य तरीकों के बारे में बहुत यकीन नहीं है।.NET में असिंक्रोनस विकास के कितने मॉडल?

मैं इस बारे में एक प्रश्न पूछा है, अधिक जानकारी के लिए लिंक नीचे देखें:

How to return T value from BeginInvoke?

ऊपर के लिंक में, Gravell ने कहा कि अतुल्यकालिक विकास के चार मॉडल हैं कि

वहाँ है कम से कम 4, फिर - एक नियमित कॉलबैक (गैर-एपीएम, गैर-ईएपी) असामान्य नहीं है

लेकिन ओवरफ्लो ने कहा कि तीन हैं कि:

नेट

  • एपीएम में अतुल्यकालिक विकास के 3 मॉडल हैं - (BeginXXX/EndXXX) जिसे आप यहां प्रयोग कर रहे हैं, जब लंबे समय से चल रहा है कार्य को पूरा करता है, यह EndXXX विधि

  • ईएपी में अपने कोड में वापस कॉल - घटना पर आधारित है। इस मॉडल में, जब लंबे समय तक चलने वाला कार्य पूरा हो जाता है, तो आपके कोड को सूचित करने के लिए एक ईवेंट उठाया जाता है।

  • टीपीएल - .NET 4 में नया, यह कार्य-आधारित संस्करण है। यह एक धाराप्रवाह इंटरफ़ेस का उपयोग कर क्लाइंट कोड में सिंक्रोनस प्रोग्रामिंग की तरह दिखता है। यह ContinueWith का उपयोग कर आपके कोड पर वापस कॉल करता है।

कोई भी इस पर मेरी सहायता कर सकता है?

मैंने google.com को बहुत खोजा है, लेकिन वास्तव में वे BeginInvoke का उपयोग कर रहे हैं। आपकी सहायता के लिए धन्यवाद।

उत्तर

3

Thread.Start - क्रूर

delegate.BeginInvoke/EndInvoke - 'पुराने' मानक

ThreadPool.QueueUserWorkItem - स्मार्ट

TaskFactory.StartNew - यह सही (Patterns of parallel programming किताब के अनुसार करने के लिए एक ही रास्ता | मैं सुझाव है कि आप यह पहली बार पढ़ने के लिए असंबद्धता के लिए)

+0

आपके उत्तर के लिए धन्यवाद, घटना आधारित मॉडल के बारे में कैसे? – CharlieShi

+1

@ चार्लीशी यह सिर्फ एक मैक्रो पैटर्न है जिसे आसानी से "एसिंक्रोनस बनाने के तरीकों" में से एक के साथ आसानी से किया जा सकता है। इससे कोई फर्क नहीं पड़ता कि आप कौन सा चयन करेंगे। .NET 5 में बीटीडब्ल्यू 'async/await' कीवर्ड – Mikant

+0

के साथ एसिंक्रोनस विधि निर्माण की एक एकीकृत विधि होने जा रहा है, तो मुझे लगता है कि .NET 5 में, एसिंक फ़ंक्शन को संभालने के लिए हमारे लिए यह अधिक आसान है। डब्ल्यूपीएफ के बारे में कैसे? मैं इसे अभी सीख रहा हूं, मुझे नहीं पता कि यह सीखने के लिए उज्ज्वल भविष्य है या नहीं। – CharlieShi

1

यह निश्चित रूप से अतुल्यकालिक विकास के लिए वर्णित विधियों को सीखने के लिए उपयोगी होगा। बस आपको एक सिर देना चाहता था हालांकि सी # 5.0 पूरी तरह से फिर से डिजाइन कर रहा है कि भाषा एसिंक से कैसे निपटती है। यह दो मुख्य कीवर्ड, async और प्रतीक्षा करने के साथ-साथ इसका मुख्य विषय भी होगा। आप बस एक लंबे समय से चलने वाले काम पर प्रतीक्षा करते हैं और यह कार्य शुरू कर देगा और कॉलिंग विधि पर नियंत्रण वापस कर देगा। एक बार कार्य पूरा होने के बाद यह शेष कोड के साथ आता है।

यहां इसके उपयोग और स्पष्टीकरण के पूर्ण विवरण के लिए एक उत्कृष्ट वीडियो है। यह न केवल एसिंक ऑपरेशन करने के पुराने तरीके का वर्णन करता है बल्कि नई शैली की पूरी समीक्षा करता है।यह एसिंक अनुप्रयोगों को एक टन आसान बनाता है और प्राकृतिक प्रवाह के साथ और अधिक पठनीय बनाता है।

यह सी # एसिंक व्यवहार का भविष्य सीखने के लायक है।

http://channel9.msdn.com/events/PDC/PDC10/FT09/

+1

+1। जॉन स्कीट के पास "एडुएसिंक" ब्लॉग पोस्ट श्रृंखला में नई 'एसिंक' कार्यक्षमता पर जानकारी का भरपूर धन है: http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx – CodingWithSpike

+0

@ rally25rs Thx के लिए जिस वेबसाइट की आप सिफारिश करते हैं, वेबसाइट को बहुत सराहना करते हैं। – CharlieShi

1

वहाँ एक बहुत है कि इस शब्द में पकड़ा जा सकता है "अतुल्यकालिक विकास।"


एक के लिए, आप एक पृष्ठभूमि धागा पर कोड निष्पादित करना चाहते हो सकता है। मैंने हाल ही में पृष्ठभूमि में कोड निष्पादित करने के लिए कई सामान्य दृष्टिकोणों के विपरीत blog post of mine को अद्यतन किया है। यहाँ सूची है, क्रम में सबसे वांछनीय से कम से कम करने के लिए:

  1. Task (के रूप में async द्वारा प्रयोग किया जाता/इंतजार है)।
  2. Task (जैसा कि कार्य समानांतर लाइब्रेरी द्वारा उपयोग किया जाता है)।
  3. BackgroundWorker
  4. Delegate.BeginInvoke
  5. ThreadPool.QueueUserWorkItem
  6. Thread

एक और ओर, आप करना चाहते हो सकता है एक अतुल्यकालिक आपरेशन (जो हो सकता है या वास्तविक कोड एक पृष्ठभूमि धागे पर क्रियान्वित नहीं हो सकता है) का प्रतिनिधित्व करते हैं। उस मामले में, वहाँ कई दृष्टिकोण, क्रम में सबसे वांछनीय से कम से कम करने के लिए कर रहे हैं:

  1. TaskBegin*/End* तरीकों (जो दुर्भाग्यपूर्ण नाम Asynchronous Programming Model (APM) है) के साथ
  2. IAsyncResult (Task-based Asynchronous Pattern (TAP) की शैली में)।
  3. Event-based Asynchronous Pattern (EAP) का उपयोग करके लिखा गया एक घटक।

(एक तरफ ध्यान दें के रूप में, BackgroundWorker ईएपी है, और Delegate.BeginInvoke एपीएम है)।


एक और ओर, आप सामान्य रूप में अतुल्यकालिक प्रोग्रामिंग है, जो एक प्रतिक्रियाशील दृष्टिकोण मतलब करने के लिए व्याख्या की जा सकती हो सकता है। इस मामले में, केवल दो दृष्टिकोण हैं जिन्हें मैं जानता हूं:

  1. Reactive Extensions (Rx)
  2. Event-based Asynchronous Pattern (EAP)

हालांकि, अगर आप एक मामला है कि किसी भी घटना पर ही आधारित कार्यक्रम कुछ हद तक प्रतिक्रियाशील है, इसलिए केवल यूआई घटनाओं से निपटने के लिए एक (सरल) का रूप है कर सकता है "अतुल्यकालिक प्रोग्रामिंग।"


इसके अलावा, ये केवल सामान्य मॉडल हैं। कोई भी मंच या पुस्तकालय और जोड़ सकता है।यहाँ मेरे सिर के ऊपर से कुछ है:

  • Socket वर्ग कि स्मृति आवंटन कम करने के लिए इस्तेमाल किया जा सकता एपीएम की एक विशेष रूप है। यह एपीएम के समान ही काम करता है लेकिन पैटर्न में फिट नहीं होता है।
  • WinRT रनटाइम (विंडोज 8 में आने) में एसिंक्रोनस ऑपरेशंस (IAsyncOperation<TResult> और IAsyncInfo) का अपना प्रतिनिधित्व है।
  • विंडोज फोन के पास background agent के लिए विशिष्ट समर्थन है, जो आपको पृष्ठभूमि में कोड चलाने की अनुमति देता है भले ही आपका ऐप वर्तमान में चल रहा न हो।
संबंधित मुद्दे