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

也许可以看看TaskContinuationOptions。你也许可以写这样的东西:

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

如果任务"tsk.Result.GetResponseStream()"引发异常,则将运行"YourMethodToHandleExceptions"。如果没有异常并且任务为IsCompleted或IsCancelled,则它将跳过该部分的继续操作,并继续执行"逻辑更新记录"。

正如之前多次引用的那样,这里有一篇优秀的TPL文章(我已经将您与continuations联系起来):http://www.albahari.com/threading/part5.aspx#_Continuations

您也可以在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.
});

最新更新