2016-04-14 79 views
0

我想將其轉換爲處理異常的並行編程。HttpWebRequest並行編程處理異常

public List<ExcelRecord> GetReport(List<ExcelRecord> records, string type) 
    { 

     foreach (ExcelRecord rec in records) 
     {     
      CheckHealth(rec); 
     } 

     return records; 
    } 

    private void CheckHealth(ExcelRecord rec) 
    { 
     string uri=rec.Url; 
     WebRequest request = WebRequest.Create(uri);   


     try 
     { 
      System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true; 

      HttpWebRequest req = WebRequest.Create(uri) as HttpWebRequest; 
      req.UserAgent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"; 
      WebResponse wr = req.GetResponse(); 

      Stream responseStream = wr.GetResponseStream(); 
      rec.StatusCode = ((HttpWebResponse)wr).StatusCode; 
      rec.Output = new StreamReader(responseStream).ReadToEnd();    


     } 
     catch (WebException wex) 
     { 
      if (wex.Response != null) 
      { 
       var pageContent = new StreamReader(wex.Response.GetResponseStream()) 
             .ReadToEnd(); 
       rec.StatusCode = ((HttpWebResponse)wex.Response).StatusCode; 

       rec.ErrorText = pageContent; 
       rec.IsHtmlText = true; 
      } 
      else 
      { 
       rec.ErrorText = wex.Message; 
      } 
     } 
     catch (Exception ex) 
     { 
      rec.ErrorText = ex.Message; 

     } 
    } 

我試過這個並行。

private void CheckHealth(string uri, ExcelRecord rec) 
    { 

    HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(reqstString); 

    var taskResp = Task.Factory.FromAsync<WebResponse>(wreq.BeginGetResponse, 
                wreq.EndGetResponse, 
                null); 

    taskResp.ContinueWith(tsk => tsk.Result.GetResponseStream()) 
           .ContinueWith((Task<Stream> trs) => 
           { 
            //Logic to update records 
           } 
    } 

,但不知道如何處理我在上面處理的引發WebException和其他異常。在並行代碼中,我得到異常taskResp.ContinueWith(tsk => tsk.Result.GetResponseStream())

如何使並行處理異常並更新記錄?

I am using .Net 4.0 Framework. So no async or await for me

+0

您可以使用異步和等待在4.0爲好。那麼這種持續的混亂就會消失。 – usr

+0

'System.Net.ServicePointManager.ServerCertificateValidationCallback + =(sender,cert,chain,errors)=> true;'是內存泄漏。回調將積累。 – usr

回答

0

也許看一看的TaskContinuationOptions。你也許可以寫類似:如果任務'tsk.Result.GetResponseStream()拋出一個異常

taskResp.ContinueWith(tsk => tsk.Result.GetResponseStream()) 
        .ContinueWith((t) => YourMethodToHandleExceptions(t.Exception), TaskContinuationOptions.OnlyOnFaulted) 
        .ContinueWith((Task<Stream> trs) => 
         { 
          //Logic to update records 
         } 

,「YourMethodToHandleExceptions」將會運行。如果沒有異常並且任務IsCompleted或IsCancelled,那麼它將跳過延續的那部分並用'Logic to update records'進行處理。

如前面所引用多次,這裏有個優秀的第三方物流的文章(我掛你延續):http://www.albahari.com/threading/part5.aspx#_Continuations

0

您可以使用異步和等待在4.0爲好。那麼這種持續的混亂就會消失。

如果你不想這樣做,你可以解開這個有點用延續:

var taskResp = Task.Factory.FromAsync<WebResponse>(...); 
taskResp.ContinueWith(tsk => { 
//Here, you can use tsk.Status, Exception and Result to get the data or the error. 
});