我正在编写的程序需要大量的html文本,将其拆分,并在多个WebBrowser控件中显示。它被拆分是因为文本量太大而不能放在单个字符串变量中,更不用说单个WebBrowser控件了。这一切似乎都很好,直到某一点。它破坏的地方似乎是在创建了大约72个WebBrowser控件之后,每个控件都有大约2000行html。每个浏览器都实例化如下:
var browser = new WebBrowser();
browser.Navigate("about:blank");
browser.Document.OpenNew(false);
browser.Document.Write(node.HTML);
在实例化所有webbrowsers之后,表单将加载并显示自己。请注意,一次只能看到一个WebBrowser,其余的是选项卡。大约5秒后(当winforms事件循环基本上空闲时)程序将因mshtml.dll中的异常而崩溃。下面是我提出的调用堆栈:
和反汇编:
鼠标光标是程序断开的地方。我加倍检查了所有的HTML,它都是有效的。我可以分别加载html的前半部分和后半部分而不会崩溃。只有在全部加载时才会失败。我也尝试将浏览器的数量减少一半,并将它们单独显示的html数量增加一倍,最终得到相同的结果。还尝试在首次打开时在每个Web浏览器中动态加载html。
在我看来,所有Web浏览器实例之间都存在某种共享内存,最终它只会被破坏或者其他内容。
我在这里几乎不知所措。我当时正在考虑用CefSharp浏览器替换WebBrowser,但如果没有必要,我不想再去那条路。