1.
2.
好了,認識、分析完問題,就是解決問題了:
多執行緒在c#中並不難實現。它有乙個命名空間:system.threading
,提供了多執行緒的支援。
要開啟乙個新執行緒,需要以下的初始化:
threadstart startdownload = new threadstart( download );//
執行緒起始設定:即每個執行緒都執行download(),注意:download()必須為不帶有引數的方法
thread downloadthread = new thread( startdownload );//
例項化要開啟的新類
downloadthread.start();//
開啟執行緒
1. 如何控制線程的數量?
2.3.
如何判斷執行緒結束?
4.如何控制線程結束?
下面就這幾個問題提出解決方法:
1.執行緒數量我們可以通過for迴圈來實現,就如同當年初學程式設計的打點程式一樣。
比如已知使用者指定了n(它是乙個int型變數)個執行緒吧,可以用如下方法開啟五個執行緒
thread downloadthread;//
threadstart startdownload = new threadstart( download );//
執行緒起始設定:即每個執行緒都執行download()
downloadthread = new thread[ n ];//
為執行緒申請資源,確定執行緒總數
for( int i = 0; i < n; i++ )//
開啟指定數量的執行緒數
好了,實現控制開啟執行緒數是不是很簡單啊?
2.
《建立表》
create table
(ctablename) ( curl m , ctext m , ldowned i , threadnum i ) &&
<
提取url位址》
cfullname = (ctablename) + '.dbf'
&&為表新增副檔名
use
(cfullname)
go top
locate for
(empty
( alltrim
( ctext ) ) and ldowned < 2 and ( threadnum = thisnum or threadnum = - 1) ) &&
goturl = curl
recnum =
recno()
if recnum <=
reccount
() then
&&如果在列表中找到這樣的url位址
update
(cfullname)
set
ldowned = ( ldowned + 1 ) , threadnum = thisnum
where recno
() = recnum &&
cfulltablename = (ctablename) + '.dbf'
use
(cfulltablename)
set exact on
locate for
curl = (csiteurl)
&&csiteurl
recnumnow =
recno
()&&
得到含有此位址的記錄號
update
(cfulltablename)
set
ctext = (ccontent)
where recno
() = recnumnow
&&插入對應位址的對應內容
《插入新位址》
ctablename = (ctablename) + '.dbf'
use
(ctablename)
go top
set exact on
locate for
curl = (cnewurl)
&&查詢有無此位址
if recno
() >
reccount
() then
&&如果尚無此位址
set carry off
insert into
(ctablename) ( curl , ctext , ldowned , threadnum )
values
( (cnewurl) , "" , 0 , -1 )
&&將主頁位址新增到列表
好了,這樣就解決了多執行緒中,執行緒衝突。當然,去重問題也可以在c#語言內解決,只根建立乙個臨時檔案(文字就可以),儲存所有的url位址,差對它們設定相應的屬性即可,但查詢效率可能不及資料庫快。
3.string
url = "";
inttimes = 0;
while
( url == "" )//
如果沒有找到符合條件的記錄,則不斷地尋找符合條件的記錄
if ( times > n )//
如果已經嘗試夠了次數,則退出程序
else
// 如果沒有嘗試夠次數
//進行下一步針對得到的url的處理 }
4.這個問題相對簡單,因為在問題一中已經建議,將執行緒聲名為類級陣列,這樣就很易於控制。只要用乙個for迴圈即可結束。**如下:
for( int i = 0; i < n; i++ )//
關閉指定數量n的執行緒數
好了,乙個蜘蛛程式就這樣完成了,在c#面前,它的實現原來如此簡單。
這裡筆者還想提醒讀者:筆者只是提供了乙個思路及乙個可以實現的解決方案,但它並不是最佳的,即使這個方案本身,也有好多可以改進的地方,留給讀者思考。
最後說明一下我所使用的環境:
winxp sp2 pro
vfp 9.0
visual studio 2003 .net中文企業版
CURL多執行緒抓取網頁
網上這類方法似乎太多了。但是總是有一些問題存在。對於多執行緒抓取,現在有如下幾種思路 1.用apache的多執行緒特性,讓php進行 多程序 操作,就像post本身一樣 2.用curl的curl multi庫 對於第一種,我還沒嘗試,因為這種製造的是偽多執行緒,也許效率會低很多,而且不好控制。第二種...
c 抓取網頁內容
新增的引用 using system.net using system.io using system.io.compression 1.webclient mywebclient new webclient mywebclient.credentials credentialcache.defau...
C 抓取網頁內容
1 抓取一般內容 需要三個類 webrequest webresponse streamreader 所需命名空間 system.net system.io 核心 webrequest request webrequest.create webresponse response request.ge...