跨线程操作无效

13

可能是重复问题:
跨线程操作无效:从创建控件的线程以外的线程访问控件

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

我正尝试使用上述代码关闭Windows应用程序的选项卡,但遇到了以下错误:

跨线程操作无效。

如何解决?


2
即使在SO上搜索“跨线程”,也会得到很多结果... - Stormenet
5个回答

25

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

你可以像下面这样做:

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

您更新原始代码后的清晰说明是我成功实现我的项目中所需的唯一方法,非常感谢。 - Jason

20

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

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

这个方法对我在类似的情况下有效:从外部事件更新GUI。 - Ryan R

5
当使用线程和UI控件时,在WinForms中,您需要使用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);
            }
        }

@astander,你能告诉我怎么做吗? - Anuya
@astander 我尝试添加...如果(TaskBarRef.tabControl1.incokerequired) - Anuya
检查答案,添加一个示例。 - Adriaan Stander

1

-3

设置以下变量:

CheckIllegalCrossThreadValidation = false

7
CheckIllegalCrossThreadValidation是一项安全检查,用于防止在尝试进行跨线程UI更新时某些Windows版本崩溃。关闭它是疯狂的行为。 - Christian Hayter
由于某种原因,微软已经添加了该选项。 - Tanner Ornelas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接