2012-11-05 103 views
1

我剛剛將我的網站請求異步,之前那張約三倍的速度,但我發現了一個缺陷。讓我解釋一下,我對頁面使用了20個不同的請求。當頁面加載時,我解析結果,並將它們添加到字典中,完成後,我檢查字典中是否有關鍵字。我提供了一個關於信息被發現與否的信息。ASP.NET加快結果的處理從異步請求

現在異步運行前的所有20請求時,這花費了大約30秒。今天,我在7秒左右的時間裏運行了20個請求,很棒的改進,但是......如果舊的方法在第一個請求中找到了信息,它會在2秒內完成。使用這種方法總是需要7秒。

我應該怎麼做,一切的終點權當信息被發現的?而不是做所有二十個請求。這是代碼。

編輯我試圖刪除了WaitAll,但是這給了我表現更差。

public decimal GetWebpage(string urltovisit, string visitorurl, string information) 
    { 
     List<HtmlDocument> htmllist = new List<HtmlDocument>(); 
     System.Net.ServicePointManager.DefaultConnectionLimit = 10; 
     FetchPageDelegate del = new FetchPageDelegate(FetchPage); 
     List<IAsyncResult> results = new List<IAsyncResult>(); 
     List<WaitHandle> waitHandles = new List<WaitHandle>(); 
     _visitorUrl = visitorurl; 
     _theSearchedinformation = information; 

     for (int i = 0; i < 200; i += 10) 
     { 
      string url = urltovisit + i; 
      IAsyncResult result = del.BeginInvoke(url, null, null); 
      results.Add(result); 
      waitHandles.Add(result.AsyncWaitHandle); 
     } 

     WaitHandle.WaitAll(waitHandles.ToArray()); 

     foreach (IAsyncResult async in results) 
     { 
      FetchPageDelegate pagedelagate = (async as AsyncResult).AsyncDelegate as FetchPageDelegate; 
      //THIS FUNCTION PARSES AND ADDS THE RESULT TO A DICTIONARY 
      DocParser.StartParse(pagedelagate.EndInvoke(async)); 

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

     } 
     return 201; 
     } 

所以我應該創建delagates的一個新的列表來運行分析,並添加到字典中的方法和類的?或者我可以使用等待句柄來判斷結果是否已找到?我在這裏真的很無能?

回答

0

使用撤消的處理程序收集和返回標誌。

 

var done=false 
var index = WaitHandle.WaitAny(waitHandles.ToArray()); 
while(!done) 
{ 
    var async=waitHandles.ElementAt(index); 
    WaitHandle.RemoveAt(index); 
    FetchPageDelegate pagedelagate = (async as AsyncResult).AsyncDelegate as FetchPageDelegate; 

    // change done flag 

} 
 

但它更舒適的使用Wintellect的電源線程