【问题标题】:Why doesn't Application.DoEvents() allow the WebBrowser Control to process为什么 Application.DoEvents() 不允许 WebBrowser 控件处理
【发布时间】:2013-01-30 11:17:05
【问题描述】:

我正在使用 C# 和 VS2012 创建一个包含 WebBrowser 的应用程序。

每隔 [x] 秒不活动后,我希望我的应用程序导航回其主页(这是设计为终端应用程序)。原则上,这没问题,但我偶然发现了一个极端情况:

如果用户点击了某个调用的东西,例如 JavaScript MessageBox,我的浏览器就会卡在“忙碌”状态。最终结果是任何导航尝试都以 COM 错误 (0x800700AA) 告终。

使用 user32.dll SendMessage 函数,我能够找到并关闭窗口。现在,如果我的函数在该点结束,WebBrowser 将继续处理调用窗口的任何脚本并最终停止忙碌。这是伪代码:

// This works so long as there isn't a dialog 

private void NavigateHome(){

webBrowser.Navigate("http://www.google.com")

}

// This works to close the dialog and lets the browser return as not busy

private void NavigateHome(){

CloseWindows(); //Calls user32.dll

}

// This, again, works as long there isn't a dialog, otherwise the COM error returns

private void NavigateHome(){

CloseWindows(); //Calls user32.dll
webBrowser.Navigate("http://www.google.com")

}

// I thought this would be the solution, but the browser never continues processing

private void NavigateHome(){

CloseWindows(); //Calls user32.dll

while(webBrowser.isBusy){

Application.DoEvents();

}

webBrowser.Navigate("http://www.google.com")

}

现在,我想“正确”的解决方案是在关闭窗口后观看 DocumentCompleted 事件,但这感觉不是很有弹性。最终,我并不真正关心文档——我只想回到我的原始页面。有没有人知道我应该如何处理这个?

我也想知道为什么 Application.DoEvents() 不能像我预期的那样工作。

【问题讨论】:

  • 我假设您的webBrowser 只是卡在while 循环中。这就是isBusy 所做的。不看更多代码很难说。另外,永远不要使用Application.DoEvents()
  • @Ginosaji 我知道 DoEvents 的危险性,但我的意思是,如果函数结束,WebBrowser 将自行关闭并自行解决。但是 DoEvents 不会发生这种情况,我不明白为什么。
  • 您希望执行哪些事件处理程序以使其不再忙?
  • @Ginosaji 什么意思,对不起?
  • DoEvents 处理所有排队的窗口消息,然后返回。除非队列中有一条消息要将isBusy 设置为false,否则在这里调用DoEvents 对您没有帮助。在 UI 线程上执行长任务时保持 UI(相对)响应是一种过时的方法。

标签: c#


【解决方案1】:

为了解决这个问题,我将“CloseWindow()”函数移至后台工作线程。然后,该线程可以等待,同时 WebBrowser(在 GUI 线程上)继续处理它需要处理的任何内容以返回不忙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2011-12-29
    • 2017-12-17
    • 2011-08-01
    相关资源
    最近更新 更多