我想将其转换为并行编程,同时处理异常。
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.
});