【发布时间】: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 => 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) => true;是内存泄漏。回调会累积。
标签: c# asp.net .net httpwebrequest task-parallel-library