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

直接返回ReadFromJsonAsAsyncEnumerable结果为何抛出ObjectDisposedException?

直接返回ReadFromJsonAsAsyncEnumerable结果引发ObjectDisposedException异常

当直接返回HttpResponseMessage.Content.ReadFromJsonAsAsyncEnumerable<T>的结果,外部对其迭代时会抛出ObjectDisposedException异常。原因是方法内的HttpResponseMessage和FileStream使用了using声明,方法执行完毕返回时这些资源会被立即释放;而ReadFromJsonAsAsyncEnumerable是延迟执行的,外部开始迭代时,依赖的资源已被回收,从而触发异常。

示例问题代码:

private static IAsyncEnumerable<Item?> GetItemsThrowsExeption(CancellationToken token = default)
{
    using var response = new HttpResponseMessage(HttpStatusCode.OK);
    using var fileStream = File.OpenRead("items.json");

    response.Content = new StreamContent(fileStream);

    return response.Content.ReadFromJsonAsAsyncEnumerable<Item>(token);
}

public class Item
{
    public int Id { get; set; }

    public string Name { get; set; } = string.Empty;

    public string Description { get; set; } = string.Empty;
}

解决方案

将迭代逻辑放在方法内部,通过await foreach遍历并逐个返回元素,确保using声明的资源在整个迭代周期内保持有效,直到迭代完成后才被释放。

修改后的安全代码:

private static async IAsyncEnumerable<Item?> GetItemsSafe([EnumeratorCancellation] CancellationToken token = default)
{
    using var response = new HttpResponseMessage(HttpStatusCode.OK);
    using var fileStream = File.OpenRead("items.json");

    response.Content = new StreamContent(fileStream);

    await foreach (var item in response.Content.ReadFromJsonAsAsyncEnumerable<Item>(token))
    {
        yield return item;
    }
}

public class Item
{
    public int Id { get; set; }

    public string Name { get; set; } = string.Empty;

    public string Description { get; set; } = string.Empty;
}

内容的提问来源于stack exchange,提问作者Andreas Synnerdahl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:33:20