CsvHelper 在第二次迭代时抛出 System.ObjectDisposeException

问题描述 投票:0回答:1

我正在尝试编写一种方法,该方法将从 ZIP 文件中读取通过

IFormFile
作为
HttpRequest
提交的所有 CSV 文件。

我正在使用

CsvHelper
使用以下代码读取文件内容:

using (var archiveStream = zip.OpenReadStream())
{
    using (var archive = new ZipArchive(archiveStream))
    {
        foreach (var entry in archive.Entries)
        {
            using (var entryStream = entry.Open())
            {
                using (TextReader reader = new StreamReader(entryStream))
                {
                    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
                    {
                        using (var dataReader = new CsvDataReader(csv))
                        {
                            while (dataReader.Read())
                            {
                                object[] values = new object[dataReader.FieldCount];
                                dataReader.GetValues(values);
                                // do stuff with object[]
                            }
                        }
                    }
                }
            }
        }
    }
}

但是,在

foreach
的第二次迭代中,当到达
System.ObjectDisposedException: 'Cannot access a closed file.'
时,我得到
var dataReader = new CsvDataReader(csv)

我不清楚它认为哪个“文件”已被处理。如何在整个循环中保持该流打开?

可能相关的信息: 这是在从

Task<>
启动的
ApiController
内运行。

c# streamreader csvhelper
1个回答
0
投票
  • 它在从 ApiController 启动的 Task<> 内运行。
  • 你在等待任务吗?
  • 我不是

当请求完成时,ASP.NET 将自动处理请求数据,包括请求正文,从而导致

IFormFile.OpenReadStream
返回的流也被处理。您需要等待处理流的任务,或者下载所有数据(到内存或某种临时文件中)并启动“离线”处理(通过任务或某种后台工作管道)。

© www.soinside.com 2019 - 2024. All rights reserved.