C# Async异步方法返回List列表的最佳实现方式
错误原因
CS1983编译错误由异步方法签名不符合C#语法规则导致:所有带async修饰符的方法,返回类型必须是void(仅用于事件处理器)、Task、Task<T>、任务-like类型,或异步流类型IAsyncEnumerable<T>/IAsyncEnumerator<T>。你直接将返回类型写为List<ISyndicationItem>,不满足上述约束,因此编译失败。
修复方案
针对你收集所有ISyndicationItem并返回完整列表的需求,仅需做两处极小调整即可,现有读取、收集条目的逻辑完全不需要改动:
- 补充引入
System.Threading.Tasks命名空间(Task<T>类型定义在该命名空间下) - 将方法返回类型从
List<ISyndicationItem>修改为Task<List<ISyndicationItem>>
修正后的完整代码:
using Microsoft.SyndicationFeed; using Microsoft.SyndicationFeed.Rss; using System.Collections.Generic; using System.Threading.Tasks; using System.Xml; static async Task<List<ISyndicationItem>> ReadRSSFeed(string inputUri) { var itemList = new List<ISyndicationItem>(); using (var xmlReader = XmlReader.Create(inputUri, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Category: ISyndicationCategory category = await feedReader.ReadCategory(); break; case SyndicationElementType.Image: ISyndicationImage image = await feedReader.ReadImage(); break; case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); itemList.Add(item); break; case SyndicationElementType.Link: ISyndicationLink link = await feedReader.ReadLink(); break; case SyndicationElementType.Person: ISyndicationPerson person = await feedReader.ReadPerson(); break; default: ISyndicationContent content = await feedReader.ReadContent(); break; } } } return itemList; }
调用示例
调用该方法时使用await关键字,即可直接拿到组装完成的条目列表:
List<ISyndicationItem> rssItems = await ReadRSSFeed("目标RSS源地址");
补充说明:如果需要处理超大规模RSS源,不想一次性把所有条目加载到内存,可以将返回类型改为
IAsyncEnumerable<ISyndicationItem>,通过yield return逐个返回读取到的条目,调用方使用await foreach流式遍历消费即可。该方案不适用于你当前需要直接返回完整列表的场景,仅作扩展参考。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

