C# URL监控报错:无法将IEnumerable<Task>转为IEnumerable<Task<bool>>
问题原因
你在Select方法中传入的异步lambda表达式没有显式返回布尔值,编译器会自动推断该lambda的返回类型为Task,和你声明的IEnumerable<Task<bool>>类型不匹配,因此触发转换报错。
解决方案
只需要在lambda表达式末尾补上bool类型的返回值即可,修改后的第22行附近代码如下:
IEnumerable<Task<bool>> tasks = args.Select(async url => { bool result = await ServerStatusByAsync(url); urlToStatus.TryAdd(url, result ? "UP" : "DOWN"); // 新增返回语句,匹配Task<bool>的类型要求 return result; });
修改后Task.WhenAll返回的bool[]也能正常拿到所有URL的检测结果,后续统计下线服务器数量的逻辑也可以正常运行。
额外优化建议
不要在每次调用ServerStatusByAsync方法时都新建HttpClient实例,频繁创建销毁会导致套接字资源耗尽,建议将HttpClient改为类级别的静态单例:
在Program类中添加静态字段:
private static readonly HttpClient _httpClient = new HttpClient();
再将ServerStatusByAsync方法内新建HttpClient的代码删除,直接使用_httpClient发起请求即可。
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

