2011-12-18 11 views
6

मुझे यह समझने में थोड़ा परेशानी हो रही है कि BeginInvoke() विधि किसी प्रतिनिधि में कॉल करती है जब असीमित रूप से विधियों को कॉल किया जाता है, इसके कार्यों को पूरा करने के बाद क्यों BeginInvoke() स्वयं विधि से वापसी मूल्य वापस नहीं कर सकता है, हमें एंडइवोक की आवश्यकता क्यों है() BeginInvoke() से पूछताछ करने और उससे वापसी मूल्य वापस करने के लिए। मैं यह एक अच्छा सवाल नहीं किया जा सकता है, लेकिन मेरी भ्रम असली :-) हैप्रतिनिधि में एसिंक्रोनस कॉल के मूल्य को वापस करने के लिए हमें EndInvoke() की आवश्यकता क्यों है?

अलावा: मैं अतुल्यकालिक रूप से DelagateName.BeginInvoke (पैरामीटर) का उपयोग कर एक विधि कॉल कर सकते हैं, अब जब प्रतिनिधि में मिलान विधि (यह लगता है एक मूल्य देता है) यह काम पूरा करता है और एक मूल्य देता है, मुझे वापस मूल्य प्राप्त करने के लिए DelegateName.EndInvoke() की आवश्यकता क्यों है? पहला कॉल स्वयं विधि पूर्ण होने पर मूल्य वापस क्यों नहीं कर सकता है।

उत्तर

8

जब BeginInvoke रिटर्न, विधि समाप्त नहीं हुई है - यह असीमित होने का पूरा बिंदु है। तो BeginInvoke आपको केवल कुछ बिंदु पर परिणाम के "वादे" का प्रतिनिधित्व करने वाला टोकन दे सकता है - और आप वास्तविक परिणाम EndInvoke का उपयोग करते हुए आमतौर पर कॉलबैक में प्राप्त करने के लिए उस वादे का उपयोग करते हैं।

.NET 4 में यह Task और Task<T> का उपयोग करके अधिक सुखद ढंग से encapsulated है, लेकिन जेनेरिक .NET 1 का हिस्सा नहीं थे, इसलिए प्रतिनिधियों के लिए कुछ और अधिक ठोस दृष्टिकोण।

+0

धन्यवाद जॉन, जो वास्तव में मेरी क्वेरी हल करता है :-), मुझे लगता है कि आम आदमी की भाषा में BeginInvoke कॉल करने पर किया जाता है और नौकरी की देखभाल करने के वादे के साथ नियंत्रण वापस कर दिया जाता है, इसलिए यह अब कोई वापसी कार्य नहीं कर सकता , इसलिए EndInvoke() को बाद में उस काम को करने के लिए तैयार किया जाएगा ... (मुझे लगता है कि मैं सही सोच रहा हूं!) – mohits00691

+0

@ mohits00691: मैं इसे व्यक्त नहीं करता हूं, लेकिन मुझे लगता है कि आपको सही विचार मिल गया है :) –

+0

धन्यवाद जॉन, इस संदेह को दूर करने में मुझे बहुत मदद मिली, मुझे लगता है कि समय के साथ मैं डाइविंग पर अधिक से अधिक रहूंगा, धन्यवाद सब कुछ। – mohits00691

8

आपको केवल BeginInvoke की आवश्यकता है और EndInvoke से मिलान करना है यदि आप प्रतिनिधि को असीमित रूप से कॉल करना चाहते हैं यानी यह वर्तमान धागे को अवरुद्ध नहीं करेगा। यह लंबी चल रही विधियों या विधियों के लिए उपयोगी है जो उन प्रक्रियाओं को कॉल करते हैं जिन्हें आप नियंत्रित नहीं करते हैं उदा। आवेदन सीमाओं में।

जो आप वर्णन करते हैं उससे आप Invoke विधि का उपयोग कर बेहतर हो सकते हैं जो एक ही विधि के भीतर मूल्य वापस कर देगा - और उसी धागे i.e. समकालिक रूप से। बेशक आपके धागे को इस उदाहरण में एक लंबी चल रही प्रक्रिया से अवरुद्ध किया जा सकता है। यह निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

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