C# 哪种样式是导出csv文件的更好、更高效的方法

C# 哪种样式是导出csv文件的更好、更高效的方法,c#,asp.net-mvc-5,csvhelper,filecontentresult,C#,Asp.net Mvc 5,Csvhelper,Filecontentresult,我有两个使用.NETMVC导出CSV文件的解决方案,它们使用名为CsvHelper的NuGet包 这两种解决方案的效果相同,但我想知道哪一种解决方案在CPU、内存和磁盘io方面更有效 CsvHelper有个助手 public static void GenerateCsv<T>(Stream stream, IEnumerable<T> data) { using (var sw = new StreamWriter

我有两个使用.NETMVC导出CSV文件的解决方案,它们使用名为CsvHelper的NuGet包

这两种解决方案的效果相同,但我想知道哪一种解决方案在CPU、内存和磁盘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();
            }
        }
publicstaticvoidgeneratecsv(流,IEnumerable数据)
{
使用(var sw=newstreamwriter(stream,Encoding.UTF8))
使用(var编写器=新CsvWriter(sw))
{
writer.WriteRecords(数据);
}
}
公共静态字节[]WriteCsvToMemory(IEnumerable数据)
{
使用(var memoryStream=new memoryStream())
使用(var streamWriter=新streamWriter(memoryStream))
使用(var csvWriter=新的csvWriter(streamWriter))
{
CSV编写器写入记录(数据);
streamWriter.Flush();
返回memoryStream.ToArray();
}
}
第一种解决方案采用响应方式

        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);
        }
public void ExportDemoCsv()
{
var data=新列表();
var fileName=“exportExample.csv”;
Response.AppendHeader(“内容处置”、“附件;文件名=“+filename”);
Response.ContentType=“text/csv”;
Response.ContentEncoding=Encoding.UTF8;
Core.Helpers.CsvHelper.GenerateCsv(Response.OutputStream,data);
}
第二个解决方案使用FileContentResult并从helper获取字节[]

        public ActionResult ExportDemoCsv()
        {
            var data = new List<Test>();

            var csvByte = Core.Helpers.CsvHelper.WriteCsvToMemory(data); 
            return File(csvByte, "text/csv", "exportExample.csv");
        }
public ActionResult ExportDemoCsv()
{
var data=新列表();
var csvByte=Core.Helpers.CsvHelper.writecsvtomery(数据);
返回文件(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();
            }
        }

公共静态异步任务writecsvtomery(IEnumerable数据)
{
使用(var memoryStream=new memoryStream())
使用(var streamWriter=newstreamwriter(memoryStream,Encoding.UTF8))
使用(var csvWriter=新的csvWriter(streamWriter))
{
foreach(数据中的var记录)
{
CSV编写器写入记录(记录);
等待csvWriter.NextRecordAsync();
}
等待streamWriter.FlushAsync();
返回memoryStream.ToArray();
}
}

参考@Christian Sauer的评论,这里是一个异步版本

公共静态异步任务GenerateCsv(流、IEnumerable数据)
{
使用(var sw=newstreamwriter(stream,Encoding.UTF8))
使用(var编写器=新CsvWriter(sw))
{
foreach(数据中的var记录)
{
编剧、编剧记录(记录);
等待writer.NextRecordAsync();
}
}
}

参考@Christian Sauer的评论,这里是一个异步版本

公共静态异步任务GenerateCsv(流、IEnumerable数据)
{
使用(var sw=newstreamwriter(stream,Encoding.UTF8))
使用(var编写器=新CsvWriter(sw))
{
foreach(数据中的var记录)
{
编剧、编剧记录(记录);
等待writer.NextRecordAsync();
}
}
}

这些方法是否有异步版本?异步是现代asp.net中的一种方式,只要csv较小,效率就远远超过内存考虑。感谢Christian Sauer,我尝试编写异步模式。有没有任何方法有异步版本?异步是现代asp.net中的一种方式,只要csv很小,效率就远远超过内存考虑。感谢Christian Sauer,我尝试编写异步模式