webbrowser在新线程中并在执行后关闭相同的线程

时间:2014-12-17 00:02:21

标签: 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);
    }

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

我尝试做的是在每次执行后杀死线程并创建新线程(使用浏览器控件的新实例),但表单正在消失。 Visual Studio使程序保持运行,但表单已经消失。

问题在于我将浏览器添加到面板中,以便我可以看到正在发生的事情。我发现这些线条使形式消失。

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

如果我删除/注释这些行,一切都按预期工作。有没有办法保持浏览器"画"在窗体(面板)上仍然退出线程?

0 个答案:

没有答案