获取跨线程操作无效[重复]

Posted

技术标签:

【中文标题】获取跨线程操作无效[重复]【英文标题】:Getting Cross-thread operation not valid [duplicate] 【发布时间】:2010-12-04 04:16:26 【问题描述】:

可能重复: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 中的一个选项卡,但遇到了错误:

跨线程操作无效。

如何解决?

【问题讨论】:

即使在 SO 中搜索“跨线程”也会得到很多结果... 【参考方案1】:

您只能从主线程更改 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);

【讨论】:

仅供参考,您对原始代码的清晰更新是我能够弄清楚如何在我的中正确实现这一点的唯一方法。谢谢。【参考方案2】:

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

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

【讨论】:

这对我有类似的情况:从外部事件更新 GUI。【参考方案3】:

在使用线程和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,你能告诉我怎么做吗? @astander 我尝试添加 ... if(TaskBarRef.tabControl1.incokerequired) 查看答案,添加示例。【参考方案4】:

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

【讨论】:

【参考方案5】:

设置以下变量:

CheckIllegalCrossThreadValidation = false

【讨论】:

CheckIllegalCrossThreadValidation 是一项安全检查,可防止某些版本的 Windows 在您尝试进行跨线程 UI 更新时崩溃。关掉它太疯狂了。 出于某种原因,Microsoft 添加了该选项。

以上是关于获取跨线程操作无效[重复]的主要内容,如果未能解决你的问题,请参考以下文章

例外:跨线程操作无效:控制'pgImportProcess(进度条)'从一个线程访问,而不是它在[重复]上创建的线程

跨线程操作无效:控件'listBox1'从一个>线程访问,而不是它在[重复]上创建的线程

侦听 COM 端口时跨线程操作无效[重复]

跨线程Winforms控件编辑[重复]

不一致的“跨线程操作无效”异常

为啥我没有收到“跨线程操作无效”错误