gpt4 book ai didi

c# - 异步/等待、TaskEx.WhenAll 和异常

转载 作者:行者123 更新时间:2023-11-30 14:01:46 26 4
gpt4 key购买 nike

这只是一个想象中的问题,我希望该解决方案能够在所有类似场景中提供帮助。假设我需要计算网页上所有外部资源(图像、脚本等)的总大小。我下载页面,提取所有 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;
}
}

关于c# - 异步/等待、TaskEx.WhenAll 和异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7702264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com