У меня есть два решения для экспорта файла CSV с помощью .net MVC, в котором используется пакет NuGet с именем CsvHelper.
Эти два решения работают с одинаковым результатом, но мне интересно, какое из них лучше работает с процессором, Память, диск io?
есть помощник с CsvHelper
public static void GenerateCsv<T>(Stream stream, IEnumerable<T> data)
{
using (var sw = new StreamWriter(stream, Encoding.UTF8))
using (var writer = new CsvWriter(sw))
{
writer.WriteRecords(data);
}
}
public static byte[] WriteCsvToMemory<T>(IEnumerable<T> data)
{
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter))
{
csvWriter.WriteRecords(data);
streamWriter.Flush();
return memoryStream.ToArray();
}
}
первое решение с использованием Response way
public void ExportDemoCsv()
{
var data = new List<Test>();
var fileName = "exportExample.csv";
Response.AppendHeader("content-disposition", "attachment;filename=" + fileName);
Response.ContentType = "text/csv";
Response.ContentEncoding = Encoding.UTF8;
Core.Helpers.CsvHelper.GenerateCsv(Response.OutputStream, data);
}
второе решение с использованием FileContentResult и получение байта [] от помощника
public ActionResult ExportDemoCsv()
{
var data = new List<Test>();
var csvByte = Core.Helpers.CsvHelper.WriteCsvToMemory(data);
return File(csvByte, "text/csv", "exportExample.csv");
}
Это всего лишь вопрос, чтобы найти способ получить, как думать, такого рода вопросы и как доказать два решения
использование асинхронного было бы хорошей идеей, нокак узнать пользу.
Обновление: пишу асинхронный режим
public static async Task<byte[]> WriteCsvToMemory<T>(IEnumerable<T> data)
{
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8))
using (var csvWriter = new CsvWriter(streamWriter))
{
foreach (var record in data)
{
csvWriter.WriteRecord(record);
await csvWriter.NextRecordAsync();
}
await streamWriter.FlushAsync();
return memoryStream.ToArray();
}
}