Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# webbrowser在新线程中,并在执行后关闭同一线程_C#_Multithreading_Winforms_Webbrowser Control - Fatal编程技术网

C# webbrowser在新线程中,并在执行后关闭同一线程

C# webbrowser在新线程中,并在执行后关闭同一线程,c#,multithreading,winforms,webbrowser-control,C#,Multithreading,Winforms,Webbrowser Control,我有以下代码: private void startBtn_Click(object sender, EventArgs e) { Thread mainThread = new Thread(core); mainThread.Start("http://wikipedia.org"); } private void core(object url) { Exec((string)url); }

我有以下代码:

    private void startBtn_Click(object sender, EventArgs e)
    {
        Thread mainThread = new Thread(core);
        mainThread.Start("http://wikipedia.org");
    }

    private void core(object url)
    {
        Exec((string)url);
    }

    void Exec(string url)
    {
        var th = new Thread(() =>
        {
            using (WebBrowser wb = new WebBrowser())
            {
                wb.Dock = DockStyle.Fill;
                browserPanel.Invoke((MethodInvoker)delegate { browserPanel.Controls.Add(wb); });
                browserPanel.Invoke((MethodInvoker)delegate { browserPanel.Refresh(); });

                wb.ScriptErrorsSuppressed = true;

                wb.DocumentCompleted += (sndr, e) =>
                {
                    if (e.Url.AbsolutePath != (sndr as WebBrowser).Url.AbsolutePath)
                        return;


                    Console.WriteLine(wb.DocumentTitle);

                    // Close the current instance of the WB control and exit the current thread
                    wb.Dispose();
                    Application.ExitThread();

                    Console.WriteLine("Closed!");
                };
                wb.Navigate(url);
                Application.Run();
            }
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Name = "Browser thread";
        th.Start();
        th.Join();
    }
我试图做的是在每次执行后杀死线程,并使用浏览器控件的新实例创建一个新线程,但是表单正在消失。VisualStudio保持程序运行,但窗体已消失

问题是,我正在将浏览器添加到一个面板中,以便查看正在发生的事情。我发现这些线条使形状消失了

wb.Dock = DockStyle.Fill;
browserPanel.Invoke((MethodInvoker)delegate { browserPanel.Controls.Add(wb); });
browserPanel.Invoke((MethodInvoker)delegate { browserPanel.Refresh(); });

如果我删除/注释这些行,一切都会正常工作。有没有办法让浏览器一直绘制在formpanel上,并且仍然退出线程?

application.exitthread执行以下操作:退出当前线程上的消息循环并关闭线程上的所有窗口。因此,问题是您正在终止GUI线程。在wb.dispose之后,只需创建一个新线程并去掉exitthread。或者,与其处理它,不如创建一个新的。。。但您需要检查内存,看看这是否是一个好主意。我尝试过只处理控件,但由于我对正在使用的文件执行的一些其他操作,我觉得线程保持打开状态并使用它们。我想我是指Application.ExitThread语句作为主要罪魁祸首。是的,它是关闭GUI线程的罪魁祸首。但是,如果我不使用它,浏览器线程将保持活动状态--实际上并不确定;然后处理它。您必须删除Application.ExitThread,否则它将完全按照命令执行关闭程序的操作