इस सवाल का जवाब है कि C # नियंत्रण कैसे काम करता है
Windows प्रपत्र में नियंत्रण एक विशिष्ट थ्रेड के लिए बाध्य हैं और थ्रेड सुरक्षित नहीं हैं। इसलिए, यदि आप किसी भिन्न थ्रेड से किसी नियंत्रण विधि को कॉल कर रहे हैं, तो आपको कॉल को उचित थ्रेड पर मार्शाल करने के लिए नियंत्रण के इनवोक विधियों में से किसी एक का उपयोग करना चाहिए। इस संपत्ति का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि क्या आपको एक इनवोक विधि कॉल करनी चाहिए, जो उपयोगी हो सकती है यदि आपको नहीं पता कि थ्रेड का नियंत्रण क्या है।
नियंत्रण से। InvokeRequired
प्रभावी रूप से, इनवोक क्या करता है यह सुनिश्चित करता है कि जिस कोड को आप कॉल कर रहे हैं वह उस थ्रेड पर होता है जो नियंत्रण "प्रभावी रूप से क्रॉस थ्रेडेड अपवादों को रोकने" पर रहता है।
ऐतिहासिक दृष्टिकोण से, .Net 1.1 में, यह वास्तव में अनुमति दी गई थी। इसका मतलब यह है कि आप किसी भी पृष्ठभूमि के धागे से "जीयूआई" धागे पर कोड की कोशिश कर सकते हैं और इसे लागू कर सकते हैं। कभी-कभी यह आपके ऐप को बाहर निकलने का कारण बनता है क्योंकि आप जीयूआई थ्रेड को प्रभावी ढंग से बाधित कर रहे थे जबकि यह कुछ और कर रहा था। यह क्रॉस थ्रेडेड अपवाद है - एक टेक्स्टबॉक्स को अपडेट करने की कोशिश करने की कल्पना करें जबकि जीयूआई कुछ और पेंटिंग कर रहा है।
- कौन सी कार्यवाही प्राथमिकता पर है?
- क्या एक ही बार में दोनों का होना संभव है?
- GUI को चलाने के लिए अन्य सभी कमांड का क्या होता है?
प्रभावी रूप से, आप एक कतार में व्यवधान डाल रहे हैं, जिसके बहुत सारे अप्रत्याशित परिणाम हो सकते हैं। आह्वान प्रभावी रूप से "विनम्र" होने का तरीका है कि आप उस कतार में क्या करना चाहते हैं, और यह नियम .net 2.0 से आगे फेंक दिया गया । InvalidOperationException के माध्यम से लागू किया गया ।
यह समझने के लिए कि वास्तव में पर्दे के पीछे क्या चल रहा है, और "जीयूआई थ्रेड" का क्या मतलब है, यह समझना उपयोगी है कि संदेश पंप या संदेश लूप क्या है।
यह वास्तव में पहले से ही प्रश्न " व्हाट ए मैसेज पंप " में उत्तर दिया गया है और वास्तविक तंत्र को समझने के लिए पढ़ने की सिफारिश की जाती है जिसे आप नियंत्रण के साथ बातचीत करते समय बांध रहे हैं।
आपके द्वारा उपयोगी अन्य पढ़ने में शामिल हो सकते हैं:
शुरुआत के साथ क्या हो रहा है
विंडोज जीयूआई प्रोग्रामिंग के कार्डिनल नियमों में से एक यह है कि केवल एक धागा जिसने एक नियंत्रण बनाया और अपनी सामग्री को एक्सेस और / या संशोधित कर सकता है (कुछ प्रलेखित अपवादों को छोड़कर)। इसे किसी भी अन्य धागे से करने की कोशिश करें और आपको अप्रत्याशित गतिरोध से लेकर आधे अपडेट किए गए UI तक अपवाद मिलेगा। फिर दूसरे थ्रेड से एक नियंत्रण को अपडेट करने का सही तरीका एप्लिकेशन संदेश कतार में एक उचित संदेश पोस्ट करना है। जब संदेश पंप उस संदेश को निष्पादित करने के लिए चारों ओर हो जाता है, तो नियंत्रण उसी थ्रेड पर अद्यतन हो जाएगा, जिसने इसे बनाया था (याद रखें, संदेश पंप मुख्य धागे पर चलता है)।
और, प्रतिनिधि नमूने के साथ अधिक कोड भारी अवलोकन के लिए:
अमान्य क्रॉस-थ्रेड ऑपरेशन
public delegate void ControlStringConsumer(Control control, string text);
public void SetText(Control control, string text) {
if (control.InvokeRequired) {
control.Invoke(new ControlStringConsumer(SetText), new object[]{control, text});
} else {
control.Text=text;
}
}
एक बार जब आप InvokeRequired के लिए सराहना करते हैं, तो आप इन कॉल को रैप करने के लिए एक एक्सटेंशन विधि का उपयोग करने पर विचार कर सकते हैं। यह स्टैक ओवरफ्लो प्रश्न में कवर अप को कवर किया गया है । इनवॉइस आवश्यक के साथ कोड को साफ किया गया है ।
ऐतिहासिक रूप से जो कुछ हुआ, वह आगे भी लिखा जा सकता है।