2009-10-06 16 views
12

Possible Duplicate:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created onहो रही पार धागा आपरेशन मान्य नहीं

public void CheckUnusedTabs(string strTabToRemove) 
{ 
    TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove]; 
    tp.Controls.Remove(this); 
    TaskBarRef.tabControl1.TabPages.Remove(tp); 
} 

मैं ऊपर कोड का उपयोग कर खिड़कियों आवेदन की TabControl में किसी टैब को बंद करने के लिए कोशिश कर रहा हूँ और मैं त्रुटि हुई:

Cross-thread operation not valid.

कैसे करें इसका समाधान करो ?

+2

एसओ में "क्रॉस थ्रेड" पर भी एक खोज भी बहुत सारे परिणाम देता है ... – Stormenet

उत्तर

25

आप केवल मास्टर धागे से WinForm नियंत्रण में परिवर्तन कर सकते का उपयोग कर जीयूआई धागा तक पहुँच रहे हैं। आपको यह जांचने की आवश्यकता है कि InvokeRequired नियंत्रण पर सत्य है या फिर आवश्यकतानुसार विधि को आमंत्रित करें।

आप इसे काम करने के लिए कुछ इस तरह कर सकते हैं:

public void CheckUnusedTabs(string strTabToRemove) 
{ 
    if (TaskBarRef.tabControl1.InvokeRequired) 
    { 
     TaskBarRef.tabControl1.Invoke(new Action<string>(CheckUnusedTabs), strTabToRemove); 
     return; 
    }  

    TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove]; 
    tp.Controls.Remove(this); 
    TaskBarRef.tabControl1.TabPages.Remove(tp); 
} 
+0

एफवाईआई, मूल कोड का आपका स्पष्ट अपडेट एकमात्र तरीका था जिसे मैं समझने में सक्षम था कि यह मेरे लिए सही तरीके से कैसे कार्यान्वित किया जाए। धन्यवाद। – Jason

+0

यह काम किया, बढ़िया! –

5

Winforms में थ्रेड और UI नियंत्रणों का उपयोग करते समय, आपको नियंत्रण में परिवर्तन करने के लिए InvokeRequired का उपयोग करने की आवश्यकता है।

संपादित करें।

एक उदाहरण जोड़ा गया।

फॉर्म, बटन और लेबल के साथ।

, आह्वान का उपयोग करके देखें

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

     private void SetLabelText(string val) 
     { 
      label1.Text = val; 
     } 
     delegate void m_SetLabel(string val); 

     private void UpdateProcess() 
     { 
      int i = 0; 

      while (true) 
      { 
       if (label1.InvokeRequired) 
       { 
        m_SetLabel setLabel = SetLabelText; 
        Invoke(setLabel, i.ToString()); 
       } 
       else 
        label1.Text = i.ToString(); 
       i++; 
       Thread.Sleep(500); 
      } 
     } 
+0

@astande आर, क्या आप मुझे बता सकते हैं? – Anuya

+0

@astander मैंने जोड़ने की कोशिश की ... अगर (TaskBarRef.tabControl1.incokerequired) – Anuya

+0

उत्तर की जांच करें, एक उदाहरण जोड़ा। –

19

कॉल क्योंकि आप एक और धागा

this.Invoke((MethodInvoker)delegate() {CheckUnusedTabs(""); }); 
+0

यह मेरे लिए एक समान मामले के साथ काम करता है: बाहरी घटना से जीयूआई अपडेट करना। –

-3

सेट निम्न चर:

CheckIllegalCrossThreadValidation = false 
+7

CheckIllegalCrossThreadValidation क्रॉस-थ्रेड यूआई अपडेट करने का प्रयास करते समय विंडोज के कुछ संस्करणों को क्रैश होने से रोकने के लिए एक सुरक्षा जांच है। इसे बंद करने के लिए पागलपन है। –

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