2012-11-04 30 views
0

這是針對ASP.NET的。我想提高運行我的功能所需的時間,今天大約需要20-30秒,而對於30secs則要比20秒多。這是在一個線程上運行20個webrequests。使用線程優化一組20個web請求

我在想,做所有的20個webreqeusts線程,以便快速查找的結果,或只是經過數據(即做所有的20個請求沒有找到任何東西)。


下面是它的工作原理。
1.我使用html敏捷包來獲取htmldocuments。
2.然後我解析這些信息
3.最後我補充一點信息字典我移動到下一個WebRequest的,直到我達到20個請求。

我讓最多20個webRequests,最低1。我已經設置,當我搜索的信息中找到結束該功能。有時信息並不存在,因此有20個webrequests(它貫穿所有數據)。

每個webrequest都會在字典中添加5-20個條目。然後將它與我發送給它的信息進行比較,如果它在列表中,我將密鑰返回,否則返回201.如果發現它被添加到數據庫。

質詢

* A:*如果我想與線程做到這一點,多少應該創建? 20每個請求一個,並讓他們都鬆動做這項工作?或者我應該創造像他們4最多5個請求每個?

B:如果兩個線程在同一時間完成,並希望信息添加到目錄中,可以將其鎖定整個網站(我使用ASP.NET),還是會嘗試添加一個從線程A然後從線程B得到一個結果?我今天已經有一個檢查,在添加密鑰之前檢查密鑰是否存在。

C:什麼是最快的方式呢?

這是我的代碼,描繪環路只是表明,20個發送請求的?

public void FetchAndParseAllPages() 
    { 

     int _maxSearchDepth = 200; 
     int _searchIncrement = 10; 

     PageFetcher fetcher = new PageFetcher(); 
     for (int i = 0; i < _maxSearchDepth; i += _searchIncrement) 
     { 
      string keywordNsearch = _keyword + i; 
      ParseHtmldocuments(fetcher.GetWebpage(keywordNsearch)); 

      if (GetPostion() != 201) 
      { //ADD DATA TO DATABASE 
       InsertRankingData(DocParser.GetSearchResults(), _theSearchedKeyword); 
       return; 
      } 
     } 
    } 

回答

2
  1. .NET只允許2請求在同一時間打開。如果你想要比這更多,你需要在web.config中配置它。看這裏:http://msdn.microsoft.com/en-us/library/aa480507.aspx

  2. 你可以Parallel.For方法,這是非常簡單的,並處理「多少線程」給你。當然,你可以調整它來設置你想要的線程(或任務)多少(ParallelOptions)。看這裏:http://msdn.microsoft.com/en-us/library/dd781401.aspx

  3. 爲了製作一個線程安全的字典,你可以使用ConcurrentDictionary。看看這裏:http://msdn.microsoft.com/en-us/library/dd287191.aspx

+0

好像異步PreRequestHandler方法是最好的嗎?但我並沒有真正考慮過這個問題,你有沒有例子?我可以將該解決方案用於我的應用程序嗎請記住,我使用htmlweb.PreRequest = new HtmlAgilityPack.HtmlWeb.PreRequestHandler(OnPreRequest);當我連接到獲取網頁。「 – 8bitcat

+0

」爲您處理「多少線程」。「這僅適用於CPU綁定的工作。對於IO界限的工作,啓發式會出現災難性的錯誤。 – usr