【发布时间】:2023-03-26 16:16:01
【问题描述】:
我有一个多线程应用程序,它使用托管在简单 WPF 窗口中的 WebBrowser 控件。
在我第一次创建窗口并显示它时 - 一切都很好。 但是 - 当我尝试多次打开它时(通常是第三次...),当我尝试调用 WebBrowser 的 Navigate 方法时,我得到了 Invalid Operation Exception。
我尝试阅读了一些关于它的内容,我认为它与 DEP 以及 WebBrowser 背后的 COM 对象有关。
我认为可能与之前的 WebBrowsers 相关,所以我尝试以不同的方式处理它,例如:
brws.DocumentCompleted -= new System.Windows.Forms.
WebBrowserDocumentCompletedEventHandler(brws_DocumentCompleted);
brws.Stop();
brws.DocumentText = "";
this.brws.Dispose();
但这并没有帮助......
也许有人看到这个错误并且知道如何解决它?
这是确切的错误数据:
异常未处理:System.AccessViolationException: System.AccessViolationException:试图读或写保护 记忆。这通常表明其他内存已损坏。
在- System.Windows.Forms.UnsafeNativeMethods.IWebBrowser2.Navigate2(对象& URL,对象和标志,对象和目标框架名称,对象和 postData, 对象和标题)
at- System.Windows.Forms.WebBrowser.PerformNavigate2(对象和 URL, 对象&标志、对象&目标帧名、对象& postData、对象& 标题)
at- System.Windows.Forms.WebBrowser.PerformNavigateHelper(字符串 urlString, Boolean newWindow, String targetFrameName, Byte[] postData,字符串标题)
at- System.Windows.Forms.WebBrowser.Navigate(String urlString)
at- Slider.HtmlWindow..ctor(String url) at- D:\rapid\Projects\HTMLSlider\Slide r\HtmlWindow.xaml.cs:第 24 行
at- Slider.Program.c_DisplayClasse.b_3() at- D:\rapid\Projects\HTMLSlider\Slider\Program.cs:第 123 行
at-System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
at- System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、Object 状态)
at-System.Threading.ThreadHelper.ThreadStart()
【问题讨论】:
-
竞争条件、停止和 DocumentText 是异步调用,您不希望后台线程完成。
-
你是指浏览器的后台线程吗?我如何等待他们完成? (我怎么知道他们是否在运行......)
-
在 DocumentCompleted 中做事。注意设置 DocumentText 会触发另一个 Navigate,您需要等待另一个 DocumentCompleted。调用 Dispose 后不要访问对象。