这只是一个想象中的问题,我希望该解决方案能够在各种类似场景中提供帮助.假设我需要计算网页上所有外部资源的总大小(图像,脚本等).我下载页面,提取所有SRC信息并将URL列表转换为下载任务:
async Task<int> GetTotalSize(Uri uri) {
  string[] urls = ... code to extract all external resources' URLs from given page ...
  var tasks = from url in urls.Distinct()
                select new WebClient().DownloadDataTaskAsync(new Uri(url));
  var files = await TaskEx.WhenAll(tasks);
  return files.Sum(file => file.Length);
}
现在,如果其中一个链接因任何原因无法访问,则整个TaskEx.WhenAll将使用WebException中止.我需要的是忽略单个任务中的任何WebExceptions,并假设在这种情况下长度为0.有任何想法吗?
只需添加一个单独的(异步)方法即可获得单个url的大小.然后加起来.
例如,
static async Task<int> GetTotalSizeAsync(params string[] urls)
{
    if (urls == null)
        return 0;
    var tasks = urls.Select(GetSizeAsync);
    var sizes = await TaskEx.WhenAll(tasks);
    return sizes.Sum();
}
static async Task<int> GetSizeAsync(string url)
{
    try
    {
        var str = await new WebClient().DownloadStringTaskAsync(url);
        return str.Length;
    }
    catch (WebException)
    {
        return 0;
    }
}
| 归档时间: | 
 | 
| 查看次数: | 2974 次 | 
| 最近记录: |