C# 获取跨线程操作无效

C# 获取跨线程操作无效,c#,winforms,multithreading,exception-handling,C#,Winforms,Multithreading,Exception Handling,可能重复: 我试图使用上述代码关闭windows应用程序的tabcontrol中的选项卡,但遇到错误: 跨线程操作无效 如何解决此问题?在winforms中使用线程和UI控件时,需要使用来更改控件 编辑 增加了一个例子 表单,带有按钮和标签 试一试 使用invoke调用,因为您正在使用另一个线程访问GUI线程 this.Invoke((MethodInvoker)delegate() {CheckUnusedTabs(""); }); 您只能从主线程更改WinForm控件。您需要检查该控件

可能重复:

我试图使用上述代码关闭windows应用程序的tabcontrol中的选项卡,但遇到错误:

跨线程操作无效


如何解决此问题?

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

编辑

增加了一个例子

表单,带有按钮和标签

试一试


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

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

您只能从主线程更改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);
}
public void CheckUnusedTabs(字符串strTabToRemove)
{ 
if(TaskBarRef.tabControl1.InvokeRequired)
{
TaskBarRef.tabControl1.Invoke(新操作(CheckUnusedTabs),strabToRemove);
返回;
}      
TabPage tp=TaskBarRef.tabControl1.TabPages[strTabToRemove];
tp.控制。移除(此);
TaskBarRef.tabControl1.TabPages.Remove(tp);
}

设置以下变量:

CheckIllegalCrossThreadValidation = false

跨线程无效异常是由于从主线程以外的其他线程访问UI控件造成的。请参阅此

@astander,你能告诉我怎么做吗?@astander我试着添加。。。如果(TaskBarRef.tabControl1.incokerequired)检查答案,则添加了一个示例。即使在SO中搜索“cross thread”,也会得到很多结果…CheckIllegalCrossThreadValidation是一种安全检查,用于防止在尝试进行跨线程UI更新时某些版本的Windows崩溃。关闭它太疯狂了。出于某种原因,Microsoft添加了该选项。这对我来说也适用于类似的情况:从外部事件更新GUI。仅供参考,您对原始代码的清晰更新是我找到如何在我的系统中正确实现此功能的唯一方法。谢谢
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);
}
CheckIllegalCrossThreadValidation = false