Как уменьшить загрузку ЦП, когда запускается обработчик события изменения прогресса? - PullRequest
0 голосов
/ 07 января 2009

Я создал приложение BHO с помощью этой ссылки .

Если я создаю исходный код, полученный в статье выше, загрузка ЦП увеличивается до 70-80%.

Как я могу уменьшить это?

В приведенной выше статье вместо обработчика событий «Полный документ» я использовал обработчик событий progresschange.

В цикле foreach я использовал для проверки тэга каждого тэга веб-страницы, при создании вышеуказанного кода (или после регистрации DLL) загрузка ЦП увеличивалась с 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;
}

Это событие генерируется повторно. Как уменьшить загрузку процессора?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2015

Это событие генерируется повторно. Как уменьшить загрузку процессора?

Функция onProgressChange потенциально может быть вызвана очень и очень быстро в зависимости от реализации webBrowser.

Попробуйте переписать onProgressChange, чтобы пропустить некоторые его вызовы и выполнять реальную работу время от времени, например, раз в секунду.

0 голосов
/ 28 августа 2009

Это вопрос без ответа. Ваша проблема использования процессора - результат того, что вы делаете, а не столько как. IE это собака, особенно если вы выгуливаете всю коллекцию. Помните, что каждый объект должен быть размещен в .Net, чтобы вы могли получить к нему доступ. Я бы порекомендовал вам подойти к вашей проблеме иначе или использовать для обработки HTML другой синтаксический анализатор, кроме IE. Вы можете использовать класс WebClient для загрузки HTML, а затем передать результат любому анализатору, который вам нравится. Запустив простой поиск в Google, вы увидите несколько альтернативных парсеров:

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

Если по какой-либо причине вы застряли в IE, вам нужно найти альтернативный ответ на оператор foreach в коллекции document.all.

...