我有一个异步任务,可以访问多个网站解析一些数据,并在完成后返回数据。如果一个或多个网站出现故障 - 我需要找出哪些网站失败了。这可能吗?这是我的一些示例代码:
控制器
public async Task<ActionResult> Index()
{
Models.WebSite ws = new Models.WebSite();
List<Task<string>> webList = new List<Task<string>>();
webList.Add(ws.GetWebsiteInfoAsync("http://website1.com"));
webList.Add(ws.GetWebsiteInfoAsync("http://website2.com"));
webList.Add(ws.GetWebsiteInfoAsync("http://website3.com"));
var taskComplete = await Task.WhenAll(webList);
return View(taskComplete);
}
发出网络请求的类:
public async Task<string> GetWebsiteInfoAsync(string url)
{
System.Net.WebClient wc = new System.Net.WebClient();
string result = null;
result = await wc.DownloadStringTaskAsync(new Uri(url));
return result;
}
答案 0 :(得分:3)
您可以检查各个任务(目前存储在列表中)。检查其属性,例如Status
或IsFaulted
。
taskComplete
完成后,所有个别网站任务也将完成。所以await
taskComplete
,吞下生成的异常并检查网站任务。
答案 1 :(得分:1)
我会创建一个包含URL和结果的请求/结果类,然后将此类的实例传递给异步请求。
完成所有任务后,您可以遍历请求列表,如果结果显示失败,则向用户显示全面的列表。
例如,课程:
public class URLRequest
{
public URLRequest(string url)
{
Url = url;
}
public string Url{get;set;}
public string Result { get; set; }
}
然后,您可以创建请求列表并使用它们来触发异步请求:
var requests = new List<URLRequest>();
requests.Add(new URLRequest("http://website1.com"));
requests.Add(new URLRequest("http://website2.com"));
requests.Add(new URLRequest("http://website3.com"));
foreach (var request in requests) {
webList.Add(ws.GetWebsiteInfoAsync(request));
}
将修改异步方法以使用请求对象的URL和结果:
public async Task<string> GetWebsiteInfoAsync(URLRequest request)
{
System.Net.WebClient wc = new System.Net.WebClient();
string result = null;
request.Result = await wc.DownloadStringTaskAsync(new Uri(request.Url));
return request.result;
}
然后,您可以通过再次循环请求来报告结果:
var message = new StringBuilder(500);
foreach (var request in requests) {
if (!string.IsNullOrEmpty(request.Result)) {
if (message.Length == 0) {
message.Append("Sorry, the following website(s) failed: ");
} else {
message.Append(", ");
}
message.Append(request.Url);
}
}
请注意,测试结果只是一个例子;如果你想捕获异常或使用其他机制来指示失败,那么你可以简单地修改请求类和异步代码。