如何在触发进度更改事件处理程序时减少CPU使用率?

时间:2009-01-07 06:34:54

标签: c# internet-explorer plugins bho

我在this link的帮助下创建了一个BHO应用程序。

如果我构建上面文章中获得的源代码,CPU使用率将增加到70-80%。

如何减少这种情况?

在上面的文章中,我使用了progresschange事件处理程序而不是Document complete事件处理程序。

在foreach循环中,我用来检查网页的每个标记的标记名,同时构建上面的代码(或者在注册dll之后),CPU使用率从10-80%增加,这可能导致如果有大量数据(元素)的网页.....

我想避免这种情况,是否有任何方法可以获取网页中所有标记的所有标记名。 请提出建议,以便我可以避免这个问题。 谢谢... 导致问题的代码是粗体字符。 对于找到的每个标记元素,它显示包含标记元素的标记名的消息框。

我遇到问题的代码是:

public void onProgressChange(int Progress, int ProgressMax) 
{    
    document = (HTMLDocument)webBrowser.Document; 
    foreach(IHTMLElement tempElement in (IHTMLElementCollection)document.documentElement.all)   
    {      
        System.Windows.Forms.MessageBox.Show(" Tagname:"+ tempElement.tagname);   
    }                 
}

public int SetSite(object site) 
{
    if (site != null)   
    {     
        webBrowser = (WebBrowser)site; 
        webBrowser.ProgressChange += new DWebBrowserEvents2_ProgressChangeEventHandler(this.onProgressChange);    
    }    
    else    
    { 
        webBrowser.ProgressChange = new DWebBrowserEvents2_ProgressChangeEventHandler(this.onProgressChange);
        webBrowser = null;     
    }

    return 0;
}

重复生成此事件。如何降低CPU使用率?

2 个答案:

答案 0 :(得分:0)

这是一个没有答案的问题。你的CPU使用问题是你做什么的结果,而不是你的做法。 IE是一只狗,特别是如果你走遍所有收藏品。请记住,必须将每个对象编组到.Net中以供您访问。我建议你以另一种方式解决问题,或使用IE以外的解析器来处理HTML。您可以使用WebClient类加载HTML,然后将结果提供给您喜欢的任何解析器。运行简单的谷歌搜索会出现几个替代解析器:

http://www.google.com/search?hl=en&rlz=1C1GGLS_enUS330US330&q=html+parser+C%23+.net&aq=f&oq=&aqi=

如果由于某种原因你坚持使用IE,你需要在document.all集合上找到foreach语句的替代答案。

答案 1 :(得分:0)

  

重复生成此事件。如何降低CPU使用率?

根据onProgressChange实施情况,可以非常快速地调用函数webBrowser

尝试重写onProgressChange以跳过其中的一些电话并偶尔进行实际工作,例如每秒一次。