【问题标题】:How to free "busy" c# webbrowser如何释放“忙碌”的 c# webbrowser
【发布时间】:2018-05-30 18:43:03
【问题描述】:

我正在使用 c# 和 webbrowser 来抓取网页。

有时,我会遇到“来自网页的消息”弹出错误。

我用:

hwnd = FindWindow("#32770", "Message from webpage");
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Button", "OK");
SendMessage(hwnd, 0xf5, IntPtr.Zero, IntPtr.Zero);

按确定。但是,当我再次尝试导航时,我会收到网络浏览器仍然繁忙的错误消息。我怎样才能强制它再次免费?

我发现的唯一解决方法是尝试“重新启动”浏览器。我正在执行以下操作:

ie.Dispose();
ie = new System.Windows.Forms.WebBrowser();

这似乎可行,但当我导航时,我得到一个“此页面上的脚本导致 Internet Explorer 运行缓慢”弹出窗口。我仍然可以继续导航,但我注意到加班时我有相当大的内存泄漏。我不确定是我“重新启动”浏览器的方式还是离开弹出窗口的方式。

如果您有办法“释放”浏览器,或者您可以确认重新启动浏览器的正确方法,我们将不胜感激。

【问题讨论】:

  • 0xf5 是做什么的?你有一个有效的 OK 按钮句柄吗?
  • 是的,我可以按下确定按钮,弹出窗口消失。
  • 也许它的网页有问题?看过很多……你能专注于看起来不错的“已知”网页……看看会发生什么?
  • 也许,但我的程序应该能够适应有问题的网页。这就是为什么我问是否有办法强制浏览器停止“忙碌”以便我可以导航。或者,如果您可以确认我是否正确地重新启动了浏览器

标签: javascript c# webbrowser-control


【解决方案1】:

您似乎正确地使用了Dispose() 来(优雅地)销毁WebBrowser 类。用new 创建它也很好。 (只需注意您使用的线程 - 按照下面的链接)

根据here,您可以尝试Stop()Refresh() 序列,尽管这可能无法防止内存泄漏。

如果泄漏是由于浏览器类、您的代码或网页本身造成的,很难从您的少量代码中判断出来......(很可能是网页,考虑到错误网页的数量)

但如果速度不重要,那么处理和更新 WebBrowser 类应该不是问题

【讨论】:

  • 我尝试了停止并刷新,但它似乎没有清除“忙碌”状态。至于使用 dispose 重新启动浏览器,我认为它并不是真的这样做。我使用 dispose() 然后等待 30 分钟,然后重新创建浏览器并导航。一旦发生这种情况,我就会看到“此页面上的脚本导致 Internet Explorer 运行缓慢”弹出窗口。我只能假设浏览器中的某些内容仍然存在,并且它认为脚本运行了 30 分钟
  • 这一切都发生在一个特定的网页上吗?如果您正常浏览该网页(在 Firefox、Chrome 等浏览器中)并使用开发人员工具查看网页中是否存在错误,会发生什么情况。
  • 您是否检查了控制面板中的高级 Internet 选项(用于管理 IE)并查看发生脚本错误时的配置?如果您不明白我的意思,请告诉我 - 我会添加图片
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2019-01-20
  • 2012-02-01
  • 2017-05-25
  • 1970-01-01
  • 2023-04-01
  • 2010-10-15
相关资源
最近更新 更多