直接返回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
相关产品推荐
相关产品推荐

