为什么Application.DoEvents()不允许WebBrowser控件处理

时间:2013-02-14 15:38:52

标签: c#

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

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

如果用户点击了调用的内容,例如JavaScript MessageBox,我的浏览器就会陷入“忙碌”状态。最终结果是任何导航尝试最终都会出现COM错误(0x800700AA)。

使用user32.dll SendMessage函数,我可以找到并关闭Window。现在,如果我的函数在那一点结束,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()不像我预期的那样工作。

1 个答案:

答案 0 :(得分:0)

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