मुख्य बिंदु यहां दिए गए हैं:
- आप यूआई कंट्रोल कॉल को किसी भिन्न थ्रेड से (फॉर्म के थ्रेड) पर बनाए गए किसी भी थ्रेड से नहीं बना सकते हैं।
- आवेदक प्रतिनिधि (यानी, ईवेंट हुक) उसी थ्रेड पर ट्रिगर किए जाते हैं जो ऑब्जेक्ट को फायर कर रहा है।
इसलिए, यदि आपके पास कुछ काम करने वाला एक अलग "इंजन" धागा है और कुछ यूआई राज्य परिवर्तनों के लिए देख रहे हैं जो यूआई (जैसे प्रगति पट्टी या जो कुछ भी) में दिखाई दे सकते हैं, तो आपको कोई समस्या है। इंजन आग की एक वस्तु ने घटना को बदल दिया है जिसे फॉर्म द्वारा लगाया गया है। लेकिन कॉलबैक प्रतिनिधि है कि इंजन के साथ पंजीकृत फॉर्म इंजन के धागे पर बुलाया जाता है? फॉर्म के थ्रेड पर नहीं। और इसलिए आप उस कॉलबैक से किसी भी नियंत्रण को अपडेट नहीं कर सकते हैं। रवींद्र!
BeginInvoke comes to the rescue. Just use this simple coding model in all your callback methods and you can be sure that things are going to be okay:
private delegate void EventArgsDelegate(object sender, EventArgs ea);
void SomethingHappened(object sender, EventArgs ea)
{
//
// Make sure this callback is on the correct thread
//
if (this.InvokeRequired)
{
this.Invoke(new EventArgsDelegate(SomethingHappened), new object[] { sender, ea });
return;
}
//
// Do something with the event such as update a control
//
textBox1.Text = "Something happened";
}
यह वास्तव में काफी सरल है।
- यह कॉलबैक सही धागे पर हुआ है या नहीं, यह जानने के लिए InvokeRequired का उपयोग करें।
- यदि नहीं, तो उसी पैरामीटर के साथ सही थ्रेड पर कॉलबैक दोबारा शुरू करें। आप Invoke (अवरुद्ध) या BeginInvoke (गैर-अवरुद्ध) विधियों का उपयोग कर एक विधि को फिर से शुरू कर सकते हैं।
- अगली बार फ़ंक्शन कहलाता है, InvokeRequired झूठी रिटर्न देता है क्योंकि हम अब सही धागे पर हैं और सभी खुश हैं।
यह इस समस्या को हल करने और बहु-थ्रेडेड ईवेंट कॉलबैक से आपके फॉर्म को सुरक्षित करने का एक बहुत ही कॉम्पैक्ट तरीका है।