2009-10-06 34 views
12

Possible Duplicate:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created onBắt hoạt động Chữ thập sợi không hợp lệ

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

Tôi cố gắng để đóng một tab trong TabControl của cửa sổ ứng dụng bằng cách sử dụng mã trên và tôi gặp phải lỗi:

Cross-thread operation not valid.

Làm thế nào để giải quyết điều này?

+2

thậm chí tìm kiếm trên "chuỗi chéo" trong SO cung cấp nhiều kết quả ... – Stormenet

Trả lời

25

Bạn chỉ có thể thực hiện thay đổi để điều khiển WinForm từ sợi tổng thể. Bạn cần kiểm tra xem InvokeRequired có đúng trên điều khiển không và sau đó gọi phương thức khi cần.

Bạn có thể làm một cái gì đó như thế này để làm cho nó hoạt:

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

FYI, cập nhật rõ ràng của bạn về mã gốc là cách duy nhất tôi có thể tìm ra cách triển khai đúng cách này trong mỏ. Cảm ơn. – Jason

+0

Nó hoạt động, tuyệt vời! –

5

Khi sử dụng đề và điều khiển giao diện người dùng, trong winforms, bạn cần phải sử dụng InvokeRequired để thay đổi các điều khiển.

EDIT.

đã thêm ví dụ.

Biểu mẫu, có nút và nhãn.

thử

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 r, bạn có thể cho tôi biết làm thế nào? – Anuya

+0

@astander tôi đã cố gắng thêm ... if (TaskBarRef.tabControl1.incokerequired) – Anuya

+0

kiểm tra câu trả lời, thêm một ví dụ. –

19

cuộc gọi sử dụng gọi, bởi vì bạn đang truy cập thread GUI sử dụng một thread

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

Điều này làm việc cho tôi với một trường hợp tương tự: cập nhật GUI từ sự kiện bên ngoài. –

-3

Đặt biến sau đây:

CheckIllegalCrossThreadValidation = false 
+7

CheckIllegalCrossThreadValidation là một kiểm tra an toàn để ngăn chặn một số phiên bản Windows bị treo khi bạn cố gắng cập nhật giao diện người dùng qua luồng. Thật điên rồ khi tắt nó đi. –

Các vấn đề liên quan