Application.DoEvents()的替代方案

5

我正在开发一个基于WebBrowser控件的消息系统,以便我可以自由格式化文本。当用户离线并收到消息时,消息将被存储,并在他们重新登录时发送每条消息的事件。当我设置网站的默认HTML等内容时,通常使用以下方法:

while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

当程序正常运行时,这个方法是有效的。但当用户处于离线状态接收到消息时,它会触发下一个消息事件,以此类推,直到最后一条消息。这意味着当用户处于离线状态时发送的最后一条消息是唯一显示的消息。我想要像Application.DoEvents()一样的东西,它允许控件保持更新和加载,但不会触发其他事件。
谢谢。
编辑:
我通过完全删除DoEvents()来解决了问题。与其在工作时更改DocumentText,我设置了一个字符串构建器,然后在最后一次性设置了html。

2
如果你正在调用 Application.DoEvents(),通常表示你的设计存在问题。你是否有任何理由不能使用“完成”事件? - leppie
我需要网页浏览器完成加载,但当前线程仍在运行。我格式化消息,然后检查支持的HTML。如果HTML有误,则更新它,然后添加消息。在更改文档文本之前,我确保网页浏览器已加载并处于完全就绪状态。 - Nathan Tornquist
2个回答

7
我建议你停止使用Application.DoEvents(),它会带来更多问题而不是解决问题。请查看此文
更好的方法是使用AutoResetEvent,在加载完成时通知,或者在加载完成后引发事件。此外,你可以将等待放到另一个线程中,这样就不必使用Application.DoEvents()了...

那是一篇很棒的文章。实际上,我只想允许webBrowser控件完成加载,然后继续执行。我不在意用户界面是否受到影响,因为代码应该足够快以避免任何问题。但是DoEvents()的工作方式,我知道那根本不是解决方案。我希望尽可能避免转到其他事件。如果可以的话,我想留在运行方法中。 - Nathan Tornquist
1
这并没有解决我的问题,但我接受了这个答案,因为它提供了关于DoEvents()的链接。提供的信息足以让我重写程序。 - Nathan Tornquist

0

您可以使用System.Threading.Thread.Join()作为DoEvents()的替代方法,因为该方法会暂停当前线程的执行,直到前面调用的线程完成执行。


2
那样做不会让WebBrowser加载。此外,也没有第二个线程。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接