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,否则它将完全按照命令执行关闭程序的操作