खोज…


अन्य थ्रेड्स से पहुँच प्रपत्र नियंत्रण

यदि आप नियंत्रण के एक विशेषता को बदलना चाहते हैं जैसे कि GUI थ्रेड की तुलना में किसी अन्य थ्रेड से कोई पाठ बॉक्स या लेबल, जिसने नियंत्रण बनाया है, तो आपको इसे इनवॉइस करना होगा अन्यथा आपको एक त्रुटि संदेश मिल सकता है:

"क्रॉस-थ्रेड ऑपरेशन मान्य नहीं है: नियंत्रण 'control_name' जिस थ्रेड पर बनाया गया था, उसके अलावा किसी थ्रेड से एक्सेस किया गया।"

इस उदाहरण कोड का उपयोग कर एक system.windows.forms फॉर्म पर उस संदेश के साथ एक अपवाद डाला जाएगा:

private void button4_Click(object sender, EventArgs e)
{
    Thread thread = new Thread(updatetextbox);
    thread.Start();
}

private void updatetextbox()
{
    textBox1.Text = "updated"; // Throws exception
}

इसके बजाय जब आप किसी टेक्स्टबॉक्स के टेक्स्ट को एक ऐसे थ्रेड के भीतर बदलना चाहते हैं, जो Control.Invoke या Control.BeginInvoke का उपयोग नहीं करता है। आप नियंत्रण का उपयोग भी कर सकते हैं। यदि नियंत्रण को लागू करना आवश्यक है तो जाँच करें।

private void updatetextbox()
{
    if (textBox1.InvokeRequired)
        textBox1.BeginInvoke((Action)(() => textBox1.Text = "updated"));
    else
        textBox1.Text = "updated";
}

यदि आपको अक्सर ऐसा करने की आवश्यकता होती है, तो आप इस चेक को बनाने के लिए आवश्यक कोड की मात्रा को कम करने के लिए अदृश्य वस्तुओं के लिए एक एक्सटेंशन लिख सकते हैं:

public static class Extensions
{
    public static void BeginInvokeIfRequired(this ISynchronizeInvoke obj, Action action)
    {
        if (obj.InvokeRequired)
            obj.BeginInvoke(action, new object[0]);
        else
            action();
    }
}

और किसी भी थ्रेड से टेक्स्टबॉक्स को अपडेट करना थोड़ा सरल हो जाता है:

private void updatetextbox()
{
    textBox1.BeginInvokeIfRequired(() => textBox1.Text = "updated");
}

ज्ञात रहे कि Control.BeginInvoke का उपयोग इस उदाहरण में किया गया है अतुल्यकालिक है, जिसका अर्थ है कि Control.BeginInvoke पर कॉल के बाद आने वाले कोड को immedeately के बाद चलाया जा सकता है, चाहे पारित प्रतिनिधि को अभी तक निष्पादित नहीं किया गया है या नहीं।

यदि आपको यह सुनिश्चित करने की आवश्यकता है कि पाठ बॉक्स 1 जारी रखने से पहले अपडेट किया गया है, तो Control.Invoke का उपयोग करें, जो कॉलिंग थ्रेड को तब तक रोक देगा जब तक कि आपके प्रतिनिधि को निष्पादित नहीं किया गया हो। ध्यान दें कि यदि आप कई इनवॉइस कॉल करते हैं और यह ध्यान रखें कि यदि आपका GUI थ्रेड कॉलिंग थ्रेड को पूरा करने या किसी रिसोर्स को रिलीज़ करने के लिए प्रतीक्षा कर रहा है तो यह आपके कोड को धीमा कर सकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow