我寫了一個爬蟲程序,它使用用戶加載的單詞列表在網站上執行多個搜索並解析每個生成的頁面。如何在異步多線程爬蟲中鎖定回調類?
爲了達到這個目的,我編寫了一個循環遍歷單詞列表的主要方法,異步地發送多個http get請求(使用ThreadPool.QueueUserWorkItem)獲取當前單詞的所有結果頁面,直到找不到更多結果爲止,然後轉到下一個單詞。
回調函數使用靜態方法訪問公共靜態類,該靜態方法解析返回的html並相應地執行操作。現在,我把它鎖在類的類型,每次的東西訪問方法:
static class Parser
{
public static string ResponseAsString(HttpWebResponse response)
{
lock (typeof(Parser))
{
try
{
Stream stream;
if (response == null || (stream = response.GetResponseStream()) == null) return string.Empty;
using (var sr = new StreamReader(stream))
return sr.ReadToEnd();
}
catch { return string.Empty; }
}
}
public static void CallbackMethod_ParseData(string html)
{
lock (typeof(Parser))
{
//Do some work here
}
}
}
如此下來,我的問題:我如何才能更有效地鎖定類,並通知正在等待的線程鎖被釋放時,或我不應該讓Parser成爲一個靜態類,而是讓每個ThreadPool線程實例化它自己的這個類的實例嗎?
非常感謝您的幫助,
-still學習
對不起我在這裏新...並且我不能upvote任何人因爲我沒有足夠的代表 – blizz
好吧,我現在感覺像一個混蛋哈哈。對不起,我忘記了最低點要求upvote。 :( –