आपके प्रश्न के विषय के अनुसार उत्तर इन बोल्ड लाइनों होगा। एमएसडीएन बेहतर नहीं हो सकता है लेकिन यह अच्छा है :)
जेफरी रिचटर ने ऊपर दिए गए आपके प्रश्न में जो कुछ पूछा है उसके बारे में लिखा है। उनके पास एमएसडीएन पत्रिका पर यह आलेख है। http://msdn.microsoft.com/en-us/magazine/cc164139.aspx यह आलेख आपको इस क्रियान्वयन को दिखाएगा कि वास्तव में (वास्तव में वास्तव में नहीं हो सकता है) इस BeginInvoke और EndInvoke वास्तव में .NET CLR में लागू किया गया है। इस लेख में कुछ समय निवेश करें और उसके बाद मुझे नहीं लगता कि अब आपको आगे पढ़ने की जरूरत है। जेफरी समृद्ध ने भी अपनी पुस्तक सीएलआर वाया सी # में यह सब अच्छी तरह से समझाया है।
अधिकांश यूआई अनुप्रयोग सिंगल थ्रेडेड हैं। यूआई पर नियंत्रण केवल उस धागे का उपयोग करके किया जा सकता है जिसके साथ वे बनाए गए थे।
इस नियंत्रण को स्वीकार करने के लिए। Winvs में इन्वोक मौजूद है। यह यूआई थ्रेड पर स्वचालित रूप से आपके कोड का आह्वान करेगा। डब्ल्यूपीएफ दुनिया में, हमारे पास Control.Invoke नहीं है। डब्ल्यूपीएफ में, हमारे पास नियंत्रण के बजाय डिस्पैचर है।
अब प्रतिनिधि बनाम प्रतिनिधि। हंस पासेंट ने एक बहुत अच्छा जवाब प्रदान किया है।
तो इसमें थोड़ा सा रहने के लिए, मैं यह जवाब लिख रहा हूं।
एमएसडीएन पर उल्लिखित प्रतिनिधि एक वर्ग है। इस कोड (MSDN http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx से लिया)
public delegate int PerformCalculation(int x, int y);
ले आप यहाँ देख सकते हैं हम प्रतिनिधि (एक छोटे से 'प' के साथ ध्यान दें) है देता है। यह एक प्रतिनिधि को परिभाषित करने या इसे सरल शब्दों में रखने के लिए एक कीवर्ड है, यह एक वैरिएबल परफॉर्म्यूलेशन को परिभाषित करने वाला एक कीवर्ड है जिसमें वास्तव में किसी विधि का संदर्भ होता है।
मुझे लगता है कि आप पहले से ही इसके बारे में जानते हैं, लेकिन केवल पूर्णता के लिए।
अब इस चर का उपयोग और एक विधि इस तरह कोड का उपयोग कर को लागू करने की:
using System;
// Declare delegate -- defines required signature:
delegate void SampleDelegate(string message);
class TestDelegate
{
private void CallMeUsingDelegate(string m_param)
{
Console.WriteLine("Called me using parameter - " + m_param);
}
public static void Main(string[] args)
{
// Here is the Code that uses the delegate defined above.
SampleDelegate sd = new SampleDelegate(CallMeUsingDelegate);
sd.Invoke("FromMain");
}
}
अब एक विधि आप ऊपर CallMeUsingDelegate पद्धति के रूप में एक पूर्ण विधि लिखने की ज़रूरत आह्वान करने के लिए। सी # में यह अज्ञात विधियां है जिसका उपयोग किसी विधि को वास्तव में विधि के रूप में लिखने के बिना करने के लिए किया जा सकता है।
तो उपरोक्त कोड भी
प्रणाली का उपयोग कर के रूप में लिखा जा सकता है; // प्रतिनिधि घोषित करें - आवश्यक हस्ताक्षर परिभाषित करता है: प्रतिनिधि शून्य नमूना डिलीगेट (स्ट्रिंग संदेश);
class TestDelegate
{
public static void Main(string[] args)
{
// Here is the Code that uses the delegate defined above.
SampleDelegate sd = delegate(param) {
Console.WriteLine("Called me using parameter - " + param);
};
sd.Invoke("FromMain");
}
}
यह उपरोक्त कोड के समान काम करता है। लेकिन अब हमें कुछ कम कोड लिखने की जरूरत है। कंपाइलर उपरोक्त दोनों संस्करणों के लिए समान आईएल कोड बनाएगा। लेकिन 2 मामले में, नई विधि में कंपाइलर द्वारा स्वत: उत्पन्न नाम होगा।
जब BeginInvoke और EndInvoke की बात आती है, तो उनका उपयोग अतुल्यकालिक तरीके से करने के लिए किया जाता है। यह थ्रेडपूल का उपयोग करके किया जाता है जो सीएलआर के साथ उपलब्ध है।
असल में क्या होता है जब आप एक विधि
IAsyncResult ar = sd.BeginInvoke(CallMeUsingDelegate, callMeOnCompletion, sd);
यहाँ का उपयोग कर प्रतिनिधि विधि है कि आप लागू कर रहे हैं कहते हैं। क्या होगा कि आपके प्रोग्राम का थ्रेड BeginInvoke विधि को कॉल करेगा जो आंतरिक रूप से सीएलआर थ्रेडपूल थ्रेड पर प्रतिनिधि पैरामीटर में निर्दिष्ट विधि का आह्वान करेगा। फिर आप प्रोग्राम जारी रखते रहेंगे और एक ऑब्जेक्ट लौटाएंगे जो IAsyncResult इंटरफ़ेस लागू करता है। आप इस ऑब्जेक्ट का उपयोग अपने प्रतिनिधि का उपयोग करके किए गए कार्य की प्रगति के बारे में पूछने के लिए कर सकते हैं (प्रतिनिधि पैरामीटर को 3 पैरामीटर के रूप में पारित करें)।
CallMeUsingDelegate विधि को एक अलग धागे (थ्रेडपूल के) पर बुलाया जाता है। जब कार्य पूरा हो जाएगा, थ्रेडपूल कॉलबैक विधि को 2 पैरामीटर के रूप में निर्दिष्ट करेगा।
यह सब देखकर आप सोच सकते हैं, हमें एंडइवोक की आवश्यकता क्यों है ???
वैसे ऐसा इसलिए है क्योंकि यदि आप एंडइवोक को कॉल नहीं करते हैं, तो सीएलआर थ्रेडपूल इस ऑपरेशन का संदर्भ रखेगा और आप कुछ स्मृति को रिसाव करेंगे। तो निर्दिष्ट कॉलबैक विधि में EndInvoke को कॉल करने के लिए यह हमेशा एक अच्छा अभ्यास है।
मुझे आशा है कि यह अब साफ़ हो जाएगा (सभी नहीं) लेकिन कुछ विचार।
एक ऐसे प्रश्न की तरह लगता है जो एमएसडीएन मंचों के लिए अधिक उपयुक्त है – chris
क्या आपका प्रश्न है "माइक्रोसॉफ्ट के दस्तावेज क्यों चूसते हैं?" यदि ऐसा है, तो यह एक रान है। क्या कोई वास्तविक सवाल है? –
आपके द्वारा उल्लेख किए गए एमएसडीएन आलेख में "थ्रेडपूल" के लिए खोजें। यह इसके बारे में काफी स्पष्ट है। –