【问题标题】:HttpWebRequest Parallel Programming Handle ExceptionHttpWebRequest 并行编程处理异常
【发布时间】:2016-04-16 19:13:19
【问题描述】:

我想将其转换为同时处理异常的并行编程。

    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 =&gt; tsk.Result.GetResponseStream()) 得到异常@

如何并行处理异常并更新记录?

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

【问题讨论】:

  • 您也可以在 4.0 上使用 async 和 await。然后这种持续的肮脏就消失了。
  • System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) =&gt; true; 是内存泄漏。回调会累积。

标签: c# asp.net .net httpwebrequest task-parallel-library


【解决方案1】:

也许看看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 文章(我已将您链接到续篇):http://www.albahari.com/threading/part5.aspx#_Continuations

【讨论】:

    【解决方案2】:

    您也可以在 4.0 上使用 async 和 await。然后这种持续的讨厌就消失了。

    如果你不想这样做,你可以使用 single 延续来解决这个问题:

    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.
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多