如何找出哪些网站失败了

时间:2013-12-27 21:28:31

标签: c# asynchronous async-await

我有一个异步任务,可以访问多个网站解析一些数据,并在完成后返回数据。如果一个或多个网站出现故障 - 我需要找出哪些网站失败了。这可能吗?这是我的一些示例代码:

控制器

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

2 个答案:

答案 0 :(得分:3)

您可以检查各个任务(目前存储在列表中)。检查其属性,例如StatusIsFaulted

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

请注意,测试结果只是一个例子;如果你想捕获异常或使用其他机制来指示失败,那么你可以简单地修改请求类和异步代码。