使跨线程操作无效

时间:2009-10-06 06:19:22

标签: c# winforms multithreading exception-handling

  

可能重复:
  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);
} 

我正在尝试使用上面的代码关闭Windows应用程序的tabcontrol中的选项卡,我遇到了错误:

  

跨线程操作无效。

如何解决这个问题?

5 个答案:

答案 0 :(得分:25)

您只能从主线程更改WinForm控件。您需要检查控件上的InvokeRequired是否为true,然后根据需要调用该方法。

你可以做这样的事情让它发挥作用:

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);
}

答案 1 :(得分:20)

使用invoke调用,因为您正在使用另一个线程访问GUI线程

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

答案 2 :(得分:5)

使用线程和UI控件时,在winforms中,您需要使用InvokeRequired来更改控件。

EDIT。

添加了一个例子。

表格,带按钮和标签。

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);
            }
        }

答案 3 :(得分:1)

交叉线程无效异常是由于从主线程以外的其他线程访问UI控件。请参阅此 http://helpprogramming.blogspot.com/2011/10/invalid-cross-thread-operation.html

答案 4 :(得分:-3)

设置以下变量:

CheckIllegalCrossThreadValidation = false