我尝试使用backgroundworker&amp ;;浏览几个网页。网页浏览器。我使用这个功能,它不起作用。我不知道这里出了什么问题。
我只看到MessageBox.Show(arr [0]);没有其他的。 webbrowser也不会改变
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" };
for (int i = 0; i < 3; i++)
{
MessageBox.Show(arr[i]);
bB_checker.Invoke((EventHandler)delegate { bB_checker.Navigate(arr[i]); });
while (bB_checker.ReadyState != WebBrowserReadyState.Complete)
{
// System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
}
}
答案 0 :(得分:4)
在不检查RunWorkerCompleted事件处理程序中的e.Error属性的情况下,永远不要实现BGW:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (e.Error != null) MessageBox.Show(e.Error.ToString());
}
在工作线程上使用ReadyState属性会导致有些神秘的无效转换异常。 WebBrowser不是线程安全的。检查this answer以获取在工作线程上创建WB的方法。
如果您需要让浏览器对用户可见,那么这不是一个好方法。在这种情况下,你将不得不放弃使用线程。这不是一个真正的问题,只需在DocumentCompleted事件处理程序中计算数组索引。尽管闪存这些网页毫无意义。
答案 1 :(得分:1)
您无法从其UI线程外部访问WebBrowser控件的属性。请记住,属性是一种隐藏的方法,因此您必须使用Invoke调用Navigate的原因相同。
Application.DoEvents()不一定(并且我不确定是否会工作),因为后台工作程序运行在与UI线程不同的线程上。
另外,不是轮询WebBrowser的状态,而是使用DocumentCompleted事件来获取异步通知:
int i = 0;
string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" };
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
bB_checker.DocumentCompleted += bB_checker_DocumentCompleted;
bB_checker.Navigate(arr[0]);
}
void bB_checker_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
i++;
if (i < arr.Length)
bB_checker.Navigate(arr[i]);
}
答案 2 :(得分:0)
确保AllowNavigation属性设置为True。 见http://dotnetpulse.blogspot.com/2006/07/why-wont-webbrowser-navigate.html