【问题标题】:C#: WebBrowser.Document breaks after document processing thread endsC#:WebBrowser.Document 在文档处理线程结束后中断
【发布时间】:2012-06-10 23:00:54
【问题描述】:

我花了整个周末才意识到,当一个文档处理线程完成时,WebBrowser.Document 对象已损坏且无法使用。

代码如下:

if (Browser.Document == null) ...

引发异常。

我有一些基于事件的脚本,它们将文档加载到 WebBrowser 并对其执行操作。当所有脚本完成时引发一个事件。

然后,根据我的文档状态 - 我会运行其他脚本。但是没有文件!为什么?它会发生什么?它是否被随机数据销毁、处置、覆盖?

在最后一个事件 .Invoke 和测试文档之间没有代码。前一行我有文件,下一行它不见了!会发生什么?!

System.Threading.Thread.CurrentThread.ManagedThreadId 为这两行返回其他值。这个杀手有解决方法吗?我现在只找到一种处理方法 - 我可以重新加载文档:

Browser.Url = Browser.Url. 但这是愚蠢和多余的。

重点是让文档能够使用 WebBrowser 对其执行更多操作。

还有一件事 - 触发我的第一个动作链的线程作为新任务执行。它运行在与在文档上运行的其余代码不同的线程中。我知道这是错的,但我第一次做对了。我没有开始新任务,而是使用 BeginInvoke 异步运行我的脚本。但是这个将整个应用程序挂在代码中的第一个其他调用上。我被困在这里。如果我以错误的方式调用浏览器代码 - 所有多线程应用程序都可以工作,但我在某处丢失了我的文档。如果我称它为正确的、线程安全的方式 - 应用程序只是挂起,我什至无法调试它。代码在调用时死掉,它从不调用它应该调用的方法。当然是默默的。

【问题讨论】:

    标签: c# multithreading events browser


    【解决方案1】:

    不看一些相关代码,很难说太多。我的猜测是您试图在一个线程上引用该对象,而不是在它创建的线程上。基于我刚刚必须处理的问题,我的建议是创建对浏览器或文档对象的静态引用。

    【讨论】:

    • 首先 - 文档是只读的 - 即使我能够将其存储在其他地方,我也无法将其分配回浏览器。在从线程返回之前复制浏览器对象并在之后恢复它也无济于事 - 恢复的对象有效,但文档像以前一样被破坏了。
    猜你喜欢
    • 2012-12-08
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多