簡體   English   中英

哪種樣式是導出csv文件的更好,更有效的方法

[英]Which style is the better and efficiency way to export csv file

我有兩種使用.net MVC導出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();
            }
        }

使用響應方式的第一個解決方案

        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的第二個解決方案,並從幫助程序獲取byte []

        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();
            }
        }

參考@Christian Sauer的評論,這是一個異步版本。

public static async Task GenerateCsv<T>(Stream stream, IEnumerable<T> data)
{
    using (var sw = new StreamWriter(stream, Encoding.UTF8))
    using (var writer = new CsvWriter(sw))
    {
        foreach (var record in data)
        {
            writer.WriteRecord(record);
            await writer.NextRecordAsync();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM