跨线程操作无效:Control '从创建它的线程以外的线程访问

本文关键字:线程 创建 访问 无效 操作 Control | 更新日期: 2023-09-27 18:13:42

我知道这个问题在这里被问了太多次,但我似乎没有得到解决,所以我发布一个新的。

我有两个表单Form1和Form2。通过将Form2的最顶层属性设置为true, Form2将显示为form1的叠加。我有一个类,为form1做处理的事情,如果找到所需的值,它会在STA线程中打开form2,作为form1的覆盖。

然而,类处理是一个连续的过程,如果在接下来的几秒钟内没有找到值,那么我需要关闭已经打开的form2,由于上述异常,我目前无法做到。

下面是我的代码:
private void runBrowserThread(bool markerFound)
{
    try
    {
        var th = new Thread(() =>
        {
            if (markerFound == true)
            {
                if (Application.OpenForms.OfType<webForm>().Count() == 0)
                {
                    webForm frm = new webForm();
                    frm.Show();
                }
                Application.Run();
            }
            else
            {
                if (Application.OpenForms.OfType<webForm>().Count() == 1)
                {
                    Form fc = Application.OpenForms["webForm"];
                    if (fc != null)
                        fc.Close(); //**This line causes cross thread exception**
                }
            }
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Start(); 
    } catch (Exception) 
    {
        //...
    }
}

跨线程操作无效:Control '从创建它的线程以外的线程访问

如果你不知道你在做什么就不要使用线程!

替换错误行
    fc.Invoke(new MethodInvoker(delegate { fc.Close(); }));

这将修复你的错误,但是你完全混合了你的工作线程和UI线程,这会给你带来更多的错误。