You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:27:36