csvhelper新手,试图确保我清理\用户下载文件后关闭所有连接,不确定我是否做得对,有人可以建议我需要做什么吗?
public ActionResult ExportClients()
{
var token = new Token(this.User.Identity.Name);
var clients =_clientService.Get(toekn.Id);
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream);
var csvWriter = new CsvWriter(streamWriter);
csvWriter.WriteRecords(clients);
streamWriter.Flush();
memoryStream.Position = 0;
return File(memoryStream, "text/csv","clients.csv");
}
答案 0 :(得分:1)
MemoryStream
,StreamWriter
和CsvWriter
全部实施IDisposable
。所以,让我们一次拿一个:
MemoryStream
FileStreamResult
will dispose of the provided stream for you,这是在控制器末尾调用File
的结果。
StreamWriter
通常情况下,您需要自行处理此类问题,例如:一个using
声明。在您的示例中,处理CsvWriter
实际上会为您执行此操作。但是,有一个问题。默认情况下:
当调用StreamWriter.Dispose时,StreamWriter对象在提供的Stream对象上调用Dispose()。
constructor overload允许底层Stream
保持打开状态。你需要使用它;否则,MemoryStream
会在FileStreamResult
抓住它之前被处理掉,并且你会得到已经处置的可怕对象"异常。
CsvWriter
这是最简单的情况 - 你可以自己处理它,例如using
声明。
这是一个令人尊敬的代码:
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8, 1024, true);
using (var csvWriter = new CsvWriter(streamWriter))
{
csvWriter.WriteRecords(clients);
// No need to flush as the StreamWriter's Dispose takes care of that.
}
memoryStream.Position = 0;
return File(memoryStream, "text/csv","clients.csv");
不幸的是,StreamWriter
的构造函数没有允许您只提供Stream
和leaveOpen
标记,所以你必须使用我的#{1}}和1024
标记。以上使用过的。 Encoding.UTF8
是默认值,但<window>
是slightly different。它应该足够了,但也许其他人会出现并指出如何更好地处理它。