2010-02-10 11 views
11

मैं vb.net का उपयोग कर रहा हूं, और मेरे प्रोग्राम में मुझे यह 'क्रॉसस्ट्रेड ऑपरेशन मान्य नहीं है' त्रुटि जब मैं अपना बैकग्राउंडर चलाता हूं जो इस टेक्स्टबॉक्स को सत्य बना देगा। मेरा मुख्य उप पहले सक्षम को गलत पर बदल देगा, और जब बैकग्राउंडर इसे चलाएगा तो इसे वापस सही कर देगा और बाहर निकलेंगे। यह मुझे एक त्रुटि क्यों देता है? जानकारी के लिए: है सटीक त्रुटि संदेशक्रॉसस्ट्रेड ऑपरेशन मान्य नहीं है ... - VB.NET

at System.Windows.Forms.Control.get_Handle() 
    at System.Windows.Forms.Control.OnEnabledChanged(EventArgs e) 
    at System.Windows.Forms.Control.set_Enabled(Boolean value) 
    at Helium.Form1.BackgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) in C:\Users\Kevin\documents\visual studio 2010\Projects\Helium\Helium\Form1.vb:line 167 
    at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) 
    at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument) 

और यहाँ:: इस के लिए और अधिक कोड है लेकिन मैं इसे किसी भी अधिक भ्रमित करने के लिए नहीं चाहता ...

यहाँ स्टैक ट्रेस है

{"Cross-thread operation not valid: Control 'mainText' accessed from a thread other than the thread it was created on."} 

क्या कोई मेरी मदद कर सकता है!

धन्यवाद,

केविन

+0

मुझे लगता है कि होगा त्रुटि संदेश सुंदर आत्म व्याख्यात्मक था। –

उत्तर

16

BackgroundWorker वर्ग के उद्देश्य गैर-जीयूआई थ्रेड पर काम करने के लिए है जबकि जीयूआई उत्तरदायी बना हुआ है। जब तक आप Control.CheckForIllegalCrossThreadCalls से false (जो आपको नहीं करना चाहिए) सेट करते हैं, या अन्य उत्तरों में सुझाए गए अनुसार Invoke का उपयोग करें (जिसे मैं भी अनुशंसा नहीं करता), तो आपको एक अवैध क्रॉस-थ्रेड ऑपरेशन अपवाद प्राप्त होगा।

आप जीयूआई से संबंधित "सामान" जबकि अपने BackgroundWorker चल रहा है तो होना चाहते हैं, मैं आम तौर पर BackgroundWorker.ReportProgress पद्धति का उपयोग करके और BackgroundWorker.ProgressChanged घटना के लिए एक उपयुक्त हैंडलर संलग्न सलाह देते हैं। यदि आप BackgroundWorker समाप्त होने के बाद जीयूआई पर कुछ करना चाहते हैं, तो BackgroundWorker.RunWorkerCompleted ईवेंट पर जीयूआई अपडेट करने के लिए बस अपने हैंडलर को संलग्न करें।

+0

+1। 'Backgroundworker.reportprogress' का उपयोग करके मुझे धागा को चलाने में मदद मिली जबकि थ्रेड चल रहा है। – Codemunkeee

2

आप सीधे एक नियंत्रण की संपत्ति एक और धागे से यूआई धागे पर है कि निर्धारित नहीं कर सकते। हालांकि यह किया जा सकता है, यहां msdn से एक उदाहरण है।

Private Sub SetText(ByVal [text] As String) 

    ' InvokeRequired required compares the thread ID of the' 
    ' calling thread to the thread ID of the creating thread.' 
    ' If these threads are different, it returns true.' 
    If Me.textBox1.InvokeRequired Then 
     Dim d As New SetTextCallback(AddressOf SetText) 
     Me.Invoke(d, New Object() {[text]}) 
    Else 
     Me.textBox1.Text = [text] 
    End If 
End Sub 
+0

तो मुझे टेक्स्टबॉक्स 1.enabled = true हिस्सा कहां रखना चाहिए? – lab12

10

आप कहाँ बिल्कुल Enabled गुण सेट करते हैं? यदि आप इसे DoWork ईवेंट हैंडलर के भीतर करते हैं, तो यह कोड बटन के निर्माण के मुकाबले एक अलग थ्रेड पर चल रहा है, जो आपको अनुभव का अपवाद देना चाहिए। इसके आसपास जाने के लिए, आपको BeginInvoke का उपयोग करना चाहिए। सुविधा के लिए यह बहुत की तरह, एक विधि में लपेटा जा सकता है:

Private Sub SetControlEnabled(ByVal ctl As Control, ByVal enabled As Boolean) 
    If ctl.InvokeRequired Then 
     ctl.BeginInvoke(New Action(Of Control, Boolean)(AddressOf SetControlEnabled), ctl, enabled) 
    Else 
     ctl.Enabled = enabled 
    End If 
End Sub 

अब आप सुरक्षित रूप से सक्षम या किसी भी धागे से कोई नियंत्रण निष्क्रिय करने के लिए है कि विधि कॉल कर सकते हैं:

SetControlEnabled(someButton, False) 
2

आपका फॉर्म_लोड() कृपया कोड भाग के नीचे लिखें। आपकी सभी समस्याओं का हल हो जाएगा।

'## crossed-thread parts will not be controlled by this option... 

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False 
11

प्रकार Form1_Load (या जो भी अपने रूप है) उप में निम्न कोड:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False 

यह अवरुद्ध पार धागा कार्यों के साथ सभी समस्याओं का निवारण करती है।

+0

ध्यान दें कि यह उत्तर * खराब * है, जैसा कि समझाया गया है [क्या यह केवल डीबगिंग के दौरान क्रॉस थ्रेडिंग त्रुटियों से बचने के लिए चेकफोर इलगैलल क्रॉस थ्रेड कॉल सेट करने के लिए सुरक्षित है?] (Http://stackoverflow.com/questions/13345091/is-it-safe -सिर्फ-टू-सेट checkforillegalcrossthreadcalls करने वाली झूठी करने वाली बचने-पार टी)। ** कृपया इसका उपयोग न करें और इसके बजाय अपने कोड के साथ मुद्दों को ठीक करें (यानी, उचित प्रतिनिधि बनाएं)। ** – cybermonkey

5

वीबीएनईटी में इसका बेहतर तरीका Extension का उपयोग करना है, यह क्रॉस-थ्रेडिंग जीयूआई कंट्रोल कॉल के लिए बहुत अच्छा दिखने वाला कोड बनाता है।

बस इस कोड को अपनी किसी भी मॉड्यूल में जोड़ें।

<System.Runtime.CompilerServices.Extension()> _ 
Public Sub Invoke(ByVal control As Control, ByVal action As Action) 
    If control.InvokeRequired Then 
     control.Invoke(New MethodInvoker(Sub() action()), Nothing) 
    Else 
     action.Invoke() 
    End If 
End Sub 

अब आप क्रॉस-थ्रेड कंट्रोल कोड लिख सकते हैं जो किसी भी नियंत्रण कॉल के लिए केवल 1 लाइन लंबी है।

इस तरह, मान लीजिए कि आपने कोई ComboBox साफ़ करना चाहते हैं और यह धागे से या धागे के बिना कहा जाता है आप अभी ऐसा करने का उपयोग कर सकते

cboServerList.Invoke(Sub() cboServerList.Items.Clear()) 

आप के बाद कुछ स्पष्ट यह जोड़ना चाहते हैं?

cboServerList.Invoke(Sub() cboServerList.Items.Add("Hello World")) 
0

AutomationPeer उपयोग करने के लिए सुझाव दें।

उदाहरण के लिए नीचे कोड कॉल करें जब मैं F5 कुंजी दबाता हूं तो निष्पादन बटन दबाएं। इसी तरह यदि आप एक थ्रेड या पृष्ठभूमि कार्यकर्ता को किसी ईवेंट या फ़ंक्शन को कॉल करना चाहते हैं तो आप ऑटोमेशन पीयर का उपयोग कर सकते हैं। बटन के बजाए आपके मामले में (जिसे मैंने यहां उपयोग किया था) आप अपने उचित संपत्ति के साथ टेक्स्ट बॉक्स का उपयोग करने के लिए उपयोग कर सकते हैं।

'Button name=btnExecute 

'Imports System.Windows.Automation.Peers 

'Imports System.Windows.Automation.Provider 

If e.Key = Key.F5 Then 

    Dim peer As New ButtonAutomationPeer(btnExecute) 

    Dim invokeProv As IInvokeProvider = TryCast(peer.GetPattern(PatternInterface.Invoke), IInvokeProvider) 

    invokeProv.Invoke() 

End If 

सादर आर.वी.

0
CheckForIllegalCrossThreadCalls = False 
+0

कृपया कुछ अतिरिक्त स्पष्टीकरण जोड़ें। – rghome

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