我有一个服务,它接受一个包含需要批量插入数据库的 CSV 数据的输入流,并且我的应用程序尽可能使用 async/await。
过程是:使用CsvHelper的CsvParser解析流,将每一行添加到DataTable中,使用SqlBulkCopy将DataTable拷贝到数据库中。
数据可以是任何大小,所以我想避免一次将整个内容读入内存 - 显然我最终将在 DataTable 中拥有所有数据,因此在内存中基本上会有 2 个副本。
我想尽可能异步地完成所有这些,但 CsvHelper 没有任何异步方法,所以我想出了以下解决方法:
using (var inputStreamReader = new StreamReader(inputStream))
{
while (!inputStreamReader.EndOfStream)
{
// Read line from the input stream
string line = await inputStreamReader.ReadLineAsync();
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var memoryStreamReader = new StreamReader(memoryStream))
using (var csvParser = new CsvParser(memoryStreamReader))
{
await streamWriter.WriteLineAsync(line);
await streamWriter.FlushAsync();
memoryStream.Position = 0;
// Loop through all the rows (should only be one as …Run Code Online (Sandbox Code Playgroud)