2011-04-01 5 views
22

मैं एक धागा धागा अलावा अन्य इस पर बनाए जाने के बाद एक combobox.Text को पढ़ने के लिए कोशिश कर रहा हूँ, लेकिन मैं त्रुटि हो रही है:थ्रेड के अलावा किसी थ्रेड से combobox को कैसे पढ़ा जाए?

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll

Additional information: Cross-thread operation not valid: Control 'levelsComboBox' accessed from a thread other than the thread it was created on.

मैंने पहले .Invoke का इस्तेमाल किया है, लेकिन केवल गुणों को सेट करने, कैसे कर सकते हैं मैं combobox.Text पढ़ने के लिए इसका उपयोग करें? क्योंकि .वॉव शून्य शून्य देता है और मुझे एक स्ट्रिंग की आवश्यकता होती है। या आमंत्रण के बिना ऐसा करने का कोई और तरीका है?

+0

मुझे लगता है कि इस बात का [कैसे वापसी मान पाने के लिए BeginInvoke/आह्वान में कहा जाता है जब डुप्लिकेट है सी #] (http://stackoverflow.com/questions/2214002/how-to-get-return-value-when-begininvoke-invoke-is-called-in-c) –

उत्तर

44

आप इस तरह यह कर सकते हैं:

this.Invoke((MethodInvoker)delegate() 
    { 
     text = combobox.Text; 
    }); 
+1

मेरे पास इस समाधान की खोज में 2 दिन हैं। thnx – Florjon

+0

महान काम करता है। इससे मुझे सी # में पर्यवेक्षक पैटर्न को लागू करने में मदद मिली। – Mythul

+0

बढ़िया! मुझे 3 एएम में भी मदद की इस वाक्यविन्यास को याद रखने के लिए मेरे सिर खरोंच ... –

2

सबसे आसान समाधान BackgroundWorker कक्षा का उपयोग किसी अन्य थ्रेड पर काम निष्पादित करने के लिए करना है, जबकि अभी भी यूआई को अपडेट करने में सक्षम है (उदाहरण के लिए प्रगति की रिपोर्ट करते समय या कार्य पूरा होने पर)।

17

आप अभी भी Invoke का उपयोग कर सकते हैं और इसे स्थानीय चर में पढ़ सकते हैं।

कुछ इस तरह:

string text; 

this.Invoke(new MethodInvoker(delegate() { text = combobox.Text; })); 

Invoke के बाद से तुल्यकालिक आप गारंटी नहीं है कि text चर कॉम्बो बॉक्स पाठ के मूल्य में यह रिटर्न के बाद शामिल होंगे है।

4

सबसे छोटा रास्ता है:

string text; 
this.Invoke(() => text = combobox.Text); 
+0

यह काम नहीं करता प्रतीत होता है। लिंक देखें: http://connect.microsoft.com/VisualStudio/feedback/details/395813/system-delegate-is-not-a-delegate-type – Bill

+0

@YongkeBillYu लिंक साइन इन करने के लिए कहता है। मुझे नहीं लगता कि क्यों हालांकि यह काम नहीं करेगा, इसे स्वीकार किए गए समाधान के समान ही करना चाहिए। –

+0

@ इगोर में एक चेतावनी है हालांकि: संकलक कोड पर तब तक शिकायत करता है जब तक कि आप इसे एक्शन टाइप में नहीं डालते हैं (http://stackoverflow.com/questions/411579/why-must-a-lambda-expression-be-cast -मुझे की आपूर्ति के रूप में एक-सादे प्रतिनिधि पैरामीटर)। कृपया कोड संपादित करें। –

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