【问题标题】:How to reduce the CPU usage when a progress change event handler is fired?触发进度更改事件处理程序时如何减少 CPU 使用率?
【发布时间】:2009-01-07 06:34:53
【问题描述】:

我在 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 使用率?

【问题讨论】:

  • 要真正找到瓶颈,请使用分析器工具并查看最需要时间的地方。但是正如 csharptest.net 已经指出的那样,最大的问题是您会一遍又一遍地运行一堆元素。
  • 修复了你的代码标记,我发现了一些错误:在 SetSite 的 else 块中设置 processchange 事件处理程序而不是添加一个(参见 if 块。第二个错误是 SetSite 中的返回 0。如果它没有function 使函数返回 void

标签: c# internet-explorer plugins bho


【解决方案1】:

这是一个没有答案的问题。您的 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 语句的替代答案。

【讨论】:

    【解决方案2】:

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

    函数onProgressChange 可能被非常快速地调用,具体取决于webBrowser 的实现。

    尝试重写onProgressChange 以跳过它的一些调用并偶尔执行一次实际工作,例如每秒一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多