程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> WebBrowser多線程帶來的麻煩

WebBrowser多線程帶來的麻煩

編輯:C#入門知識

我們在做采集軟件的時候

有些網站通過直接分析html文本是很麻煩的事情

在利用WinForm編程的情況下

有一種更好的方式當然是分析HtmlDocument

然而,這HtmlDoucment並不能直接創建

它必須由 WebBroswer控件Navigate生成一個頁面後

才能取得wb.HtmlDocument

然後就可以對HtmlDocument的各元素、標簽進行分析。

 

事實上,在采集的時候

並不是采集只會采集單個頁面

這樣的話,在主窗體中就可以完成

 

譬如采集一些列表頁面,有N多個頁

那麼,一個循環下去,

用WebBrowser去響應,那就會導致假死

這時候,我們肯定會想到用多線程去做這件事情

 

C#的多線程,

大家應該都知道,有STA,MTA兩種模式

然而,WebBrowser控件卻有一個不好的特點

那就是:它只支持多線程STA模式

例如下面的代碼,

Thread tread = new Thread(new ParameterizedThreadStart(BeginCatch));
tread.SetApartmentState(ApartmentState.STA);
tread.Start(url);

 

 

\\代碼 private void BeginCatch(object obj)
{
     string url = obj.ToString();
     WebBrowser wb = new WebBrowser();
     wb.ScriptErrorsSuppressed = true;
     wb.Navigate(url);
     wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);

 

需要分析WebBrowser產生 的HtmlDocument時,必須在事件DocumentCompleted裡面去操作

只有這時候,WebBrowser才算加載完成

 

不過,這只是一個陷阱!!!!

WebBrowser有一個特性,那就是在多線程STA的時候,根本就不等到DocumentCompleted的執行

也就是無法再進行後面的操作!!!

 

這樣的話,我們該如何辦呢?

也許有人會想:wb.Document.Write(string)方法,如下:

 

 

\\代碼 private void BeginCatch(object obj)
{
     string url = obj.ToString();
     WebBrowser wb = new WebBrowser();
     wb.ScriptErrorsSuppressed = true;      string htmlcode = GetHtmlSource(url); 
     wb.Document.Write(htmlcode);
     //執行分析操作    

//WebClient取網頁源碼
private string GetHtmlSource(string Url)
{
     string text1 = "";
     try
     {
        System.Net.WebClient wc = new WebClient();
        text1 = wc.DownloadString(Url);
     }
     catch (Exception exception1)
     {}
     r

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved