首页 新闻 会员 周边

关于 IHTMLTxtRange pasteHTML 方法的疑问

0
悬赏园豆:30 [已解决问题] 解决于 2019-08-27 16:27

最近在使用 webBrowser 做一个类似编辑器的东西,功能基本上都完成,最后却发现有一个比较严重的缺陷:

当使用 pasteHTML 方法过多时,程序响应速度会急剧下降。

using mshtml;

// 初始一个 IHTMLTxtRange 对象 txtObj
IHTMLDocument2 htmlObj = (IHTMLDocument2)webBrowser1.Document.DomDocument;
txtObj = htmlObj.selection.createRange();

// 获得页面内容
txtObj.moveStart("textedit", -1);
txtObj.moveEnd("textedit", 1);
string html = txtObj.htmlText;

// 更新页面内容
txtObj.moveStart("textedit", -1);
txtObj.moveEnd("textedit", 1);
txtObj.pasteHTML(html);

在多次更新内容后,发现响应速度变的很慢,cpu占用率升高,推测可能是每次 pasteHTML 后,数据都保存在 webBrowser 的缓存里,因为只要更换所操作的文件,速度会回到最初,但再继续多次操作后,又会变慢

我在 msdn 上搜索了半天,也没找到如何释放 pasteHTML 所占用的系统资源,请各位提供一个方法或思路

问题补充:
       private void proTest_Click(object sender, EventArgs e)
        {
            WebBrowser wb1 = new WebBrowser();
            wb1.Navigate(@"C:\Users\Whilom Lethe\Desktop\94\22\22 n.c. 13.html");
            wb1.StatusTextChanged += new EventHandler(evtFeedback);
        }

        private void evtFeedback(object sender, EventArgs e)
        {
            WebBrowser wb1 = (WebBrowser)sender;
            if (wb1.StatusText == "完成" || wb1.StatusText == "Done")
            {
                wb1.StatusTextChanged -= new EventHandler(evtFeedback);
                testPasteHtml(wb1, 10);
            }
        }

        private void testPasteHtml(WebBrowser wb, int t)
        {
            IHTMLDocument2 htmlObj = (IHTMLDocument2)wb.Document.DomDocument;
            IHTMLTxtRange txtObj = htmlObj.selection.createRange();
            txtObj.moveStart("textedit", -1);
            txtObj.moveEnd("textedit", 1);
            string html = txtObj.htmlText;
            txtObj.pasteHTML(html);
            MessageBox.Show("complate:" + t.ToString());
            if (t > 0)
            {
                testPasteHtml(wb, --t);
            }
        }

我在一个 winForm 里随便定义了一个按钮 proTest ,当点这个按钮后,生成一个 webBrowser ,然后当文档加载完成后更新10次页面内容,前几次速度非常快,第7、8次后明显速度下降(注:测试用的 html 文件大于10kb)

文盲老顾的主页 文盲老顾 | 初学一级 | 园豆:145
提问于:2012-05-31 09:28
< >
分享
最佳答案
0

txtObj.collapse(false);

收获园豆:30
390620652 | 菜鸟二级 |园豆:232 | 2015-09-15 09:56
其他回答(1)
0

你的电脑上IE浏览器装的是哪个版本?

dudu | 园豆:31007 (高人七级) | 2012-05-31 10:55

我的环境是 win7,IE9,vs10,mshtml.dll 版本是 7.0.3300.0

支持(0) 反对(0) 文盲老顾 | 园豆:145 (初学一级) | 2012-05-31 11:29

@sosome: 在 txtObj.pasteHTML(html); 之后调用一下 txtObj.close(); 试试。

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2012-05-31 11:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册