我试着用后台工作人员和网络浏览器浏览几个网页。我正在使用这个函数,但它不起作用。我不确定这里出了什么问题。
我只看到了MessageBox.Show(arr);其他什么也看不到。too浏览器也不会改变
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();
}
}
}发布于 2010-12-29 03:58:45
在未检查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事件处理程序中对数组索引进行计数即可。尽管闪现这些网页的意义不大。
发布于 2010-12-29 03:42:01
不能从WebBrowser控件的UI线程外部访问该控件的属性。请记住,属性是幕后的方法,因此这与您必须使用Invoke来调用导航的原因相同。
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]);
}发布于 2010-12-29 03:46:21
确保我将AllowNavigation属性设置为True。请参阅http://dotnetpulse.blogspot.com/2006/07/why-wont-webbrowser-navigate.html
https://stackoverflow.com/questions/4548786
复制相似问题