ग्रीटिंग्स, मैं सी # में कुछ एप्लिकेशन विकसित कर रहा हूं। फिलहाल मैं थ्रेडिंग से निपट रहा हूं और मेरे पास एक सवाल है कि मेरे दिमाग में है। Invoke और BeginInvoke के बीच क्या अंतर है? मैं कुछ धागे पढ़ सकते हैं और मैं यहाँ कुछ उपयोगी जानकारी मिल: hereInvoke और BeginInvoke
हालांकि क्या निम्नलिखित कोड में आह्वान और BeginInvoke के बीच अंतर है:
private void ProcessRoutine()
{
for (int nValue = StartFrom; nValue <= EndTo; nValue++)
{
this.Invoke(this.MyDelegate, nValue);
//this.BeginInvoke(this.MyDelegate, nValue);
}
MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
progressBar1.Value = progress;
}
जहां MyDelegate MessageHandler कार्य करने के लिए एक संदर्भ है।
मैंने देखा कि BeginInvoke lblStatus.Text का उपयोग करके रीफ्रेश नहीं किया जाता है जहां Invoke का उपयोग लेबल को रीफ्रेश करता है। इसके अतिरिक्त मुझे पता है कि Invok इसके निष्पादन को पूरा करने के लिए इंतजार कर रहा है। सबसे महत्वपूर्ण मामला मुझे रूचि है कि इस मामले में ताज़ा लेबल टेक्स्ट में कोई अंतर क्यों है।
कॉलिंग BeginInvoke मतलब यह नहीं है यह यूआई पर निष्पादित नहीं कर रहा है धागा। इसका मतलब है कि इसे "इस" से जुड़े थ्रेड पर असीमित रूप से कहा जाता है जो यूआई थ्रेड हो सकता है। –
इसलिए यदि यह किसी अन्य धागे में नहीं है, तो यह तब कैसे काम करता है? –
एमएसडीएन से: "निर्दिष्ट प्रतिनिधि को थ्रेड पर असीमित रूप से निष्पादित करता है कि नियंत्रण के अंतर्निहित हैंडल पर बनाया गया था"। इसलिए यदि इसे यूआई थ्रेड से बुलाया जाता है तो इसे कतार पर रखा जाएगा और यूआई थ्रेड निष्क्रिय होने पर निष्पादित किया जाएगा। वर्तमान में निष्पादन विधि वापस लौटने के बाद कौन सा होगा। –