Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在触发进度更改事件处理程序时减少CPU使用?_C#_Internet Explorer_Plugins_Bho - Fatal编程技术网

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

C# 如何在触发进度更改事件处理程序时减少CPU使用?,c#,internet-explorer,plugins,bho,C#,Internet Explorer,Plugins,Bho,我在的帮助下创建了一个BHO应用程序 如果我构建上述文章中获得的源代码,CPU使用率将增加到70-80%。 我如何减少这种情况? 在上面的文章中,我使用了progresschange事件处理程序,而不是DocumentComplete事件处理程序 在foreach循环中,我曾经检查网页每个标记名的标记名,在构建上述代码(或注册dll后)时,CPU使用率从10%增加到80%,如果网页上有大量数据(元素),这可能会导致问题 我想避免这种情况,是否有任何方法可以让我获得网页中所有标记的所有标记名。 请

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

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

我如何减少这种情况?

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

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

这是一个没有答案的问题。你的CPU使用问题是你做什么的结果,而不是怎么做的结果。IE是一只狗,尤其是当你在所有的收集中行走时。请记住,每个对象都必须封送到.Net中才能访问它。我建议您以另一种方式处理问题,或者使用IE以外的解析器来处理HTML。您可以使用WebClient类加载HTML,然后将结果提供给您喜欢的任何解析器。运行一个简单的谷歌搜索将出现几个可选的解析器:

如果出于任何原因,您坚持使用IE,那么您需要找到document.all集合中foreach语句的替代答案

此事件会重复生成。如何减少CPU使用

函数
onProgressChange
可以根据
webBrowser
实现非常快速地调用


尝试重写
onProgressChange
跳过一些调用,偶尔做一次实际工作,例如每秒一次。

要真正找到瓶颈,请使用探查器工具并查看最需要时间的地方。但是正如csharptest.net已经指出的,最大的问题是您反复运行了一堆元素。修复了代码标记,我发现了一些错误:在SetSite中的else块中设置processchange eventhandler,而不是添加一个(参见if块。第二个错误是SetSite中的返回0。如果没有函数,则使函数返回无效。)