C# 等待WebBrowser完成加载时Application.DoEvents()出现问题

C# 等待WebBrowser完成加载时Application.DoEvents()出现问题,c#,browser,innerhtml,doevents,readystate,C#,Browser,Innerhtml,Doevents,Readystate,我正在尝试加载WebBrowser内容,然后我想添加一些文本并滚动到底部 下面是我的代码示例: webBrowser1.Url = new System.Uri("file:///" + filePath); webBrowser1.Document.Body.InnerHtml += text; webBrowser1.Document.Body.ScrollTop = webBrowser1.Document.Body.ScrollRectangle.Height; 当我运行它时,有一个未

我正在尝试加载WebBrowser内容,然后我想添加一些文本并滚动到底部

下面是我的代码示例:

webBrowser1.Url = new System.Uri("file:///" + filePath);
webBrowser1.Document.Body.InnerHtml += text;
webBrowser1.Document.Body.ScrollTop = webBrowser1.Document.Body.ScrollRectangle.Height;
当我运行它时,有一个未处理的异常“对象引用未设置为对象的实例”。或者,当我注释行进行滚动时,文本被添加到WebBrowser以前的内容中,然后导航到新内容

因此,在我的示例代码的第一行之后,我将:

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();
但它把一切都搞砸了。我的应用程序正在做一些非常奇怪的事情,例如多次调用同一个方法,而它应该被调用一次


有什么解决方案吗?

DoEvents()
在这里是个糟糕的解决方案。您应该使用显式线程或
BackgroundWorker
加载页面,并留下UI线程来处理其他内容。

我认为您实际上想要订阅事件。
仅处理挂起的Windows消息循环项


在这两种情况下,请确保在使用前了解调用
DoEvents

是否有任何计时器或异步方法在后台运行,可能会影响此操作?您是否在webBrowser1对象上有任何将被调用的事件,例如OnReadyStateChanged?是的,处理可能会导致重入问题、
StackOverflowException
(万一DoEvents将再次调用DoEvents的方法)和其他有趣的事情。在调用它之前,最好确保您了解
DoEvents
的工作原理。我认为这种方法的混乱部分是因为曾经流行的VisualBasic6有一个名称完全相同的方法,该方法被用作多线程的糟糕替代品。我没有用VB6编写,但它仍然被用作替代品。结果实际上是一样的:)有点离题,但无论如何。在Windows上的低级本机编程中也有类似的东西,称为“用户APC”或异步过程调用。有时很有用,但也很危险。WebBrowser无法在MTU上运行,BackgroundWorker创建MTU线程only@odyodyodys你是说MTA多线程公寓吗?在这种情况下,像那样使用这个组件是个坏主意。也许它允许显式地设置内容(而不是设置Uri),或者以某种方式使内容下载异步?