2011-09-30 11 views
8

मैं थ्रेडिंग पर अभ्यास कर रहा हूं और इस समस्या में आया हूं।एक अलग थ्रेड से एक फॉर्म के नियंत्रण तक पहुंच

    1. मैं पेज लोड हो रहा है स्थिति आदि को दिखाने के लिए एक फ़ाइल, एक डाउनलोड करने के लिए एक भी फार्म पर 4 प्रगति सलाखों, एक है ... मैं नियंत्रित करने के लिए: स्थिति इस तरह है एक अलग थ्रेड से प्रत्येक प्रोग्रेसबार की प्रगति।

    समस्या मैं एक InvalidOperationException जो वैध

    पार धागा आपरेशन नहीं कहते हो रही है: नियंत्रण 'progressBar1' एक धागा धागा उस पर बनाया गया था के अलावा अन्य से पहुँचा ।

    क्या मैं इस दृष्टिकोण में गलत हूं या कोई मुझे बता सकता है कि इसे कैसे कार्यान्वित किया जाए?

  • +1

    विंडोज फॉर्म में थ्रेडिंग पर जॉन स्कीट द्वारा [यह] http://www.yoda.arachsys.com/csharp/threads/winforms.shtml) आलेख देखें। इसे चीजों को साफ़ करना चाहिए। संक्षिप्त स्पष्टीकरण यह होगा कि यूआई तत्वों को आपके अन्य धागे से आह्वान करने की आवश्यकता है, क्योंकि यूआई अपने धागे पर चलता है। – alex

    उत्तर

    9

    यूआई तत्वों को केवल यूआई थ्रेड द्वारा एक्सेस किया जा सकता है। WinForms और WPF/Silverlight एकाधिक थ्रेड से नियंत्रण तक पहुंच की अनुमति नहीं देता है।

    A work-around to this limitation can be found here

    2

    आपको फॉर्म और अन्य नियंत्रणों पर कुछ क्रियाएं करने के लिए गैर-यूआई थ्रेड से विधि को आमंत्रित करने की आवश्यकता है।

    +0

    मैं एक अग्रिम प्रोग्रामर नहीं हूं। क्या आप सलाह दे सकते हैं कि हम यह कैसे करते हैं? धन्यवाद –

    +0

    @ चंदू-इंदियाह - यदि आप उन्नत प्रोग्रामर नहीं हैं तो आपको पृष्ठभूमिवर्कर का उपयोग करना चाहिए। Lambda कार्यों का उपयोग करने के लिए –

    9

    आप Control.InvokeRequired ध्वज की जांच कर सकते हैं और फिर आवश्यक होने पर Control.Invoke विधि का उपयोग कर सकते हैं। Control.Invoke एक प्रतिनिधि लेता है ताकि आप अंतर्निहित एक्शन < टी > का उपयोग कर सकें। यूआई धागा -

    public void UpdateProgress(int percentComplete) 
    { 
        if (!InvokeRequired) 
        { 
         ProgressBar.Value = percentComplete; 
        } 
        else 
        { 
         Invoke(new Action<int>(UpdateProgress), percentComplete); 
        } 
    } 
    
    30

    एक Control केवल धागा है कि यह बनाया से पहुंचा जा सकता। ,

    Invoke(new Action(() => 
    { 
        progressBar1.Value = newValue; 
    })); 
    

    आह्वान विधि तो दिए गए प्रतिनिधि कार्यान्वित यूआई धागे पर:

    आप की तरह कुछ करने के लिए होता है।

    +2

    +1। – alex

    5
    private void Form1_Load(object sender, EventArgs e) 
        { 
         CheckForIllegalCrossThreadCalls = false; 
        } 
    

    शायद यह काम करेगा।

    +0

    इस तरह से समर्थन नहीं करेगा लेकिन यह काम करता है :-) – Swanand

    संबंधित मुद्दे