我有一个包装MemoryStream
的DocumentGenerator
类。所以我在这个类上实现了IDisposable
。
不过,我不知道如何/在哪里可以处理它。
这是我当前的代码,它在MVC中执行文件下载:
using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))
{
/* some document manipulation with the
DocumentGenerator goes here ...*/
return File(dg.GetDocumentStream(), "text/plain", filename);
}
这个错误是因为流在控制器完成之前被关闭/释放。在这种情况下,我如何确保我的资源得到了正确的处理?
编辑:目前我的IDisposable
实现只处理MemoryStream
。我知道这不是一个正确的实现,我只是将其用作测试。这里有没有什么我可以做的不一样的事情来让它工作?
public void Dispose()
{
_ms.Dispose();
_ms = null;
}
发布于 2010-06-22 00:06:01
您不需要处理流。它将由FileStreamResult.WriteFile方法处理。这个类的代码摘录:
public FileStreamResult(Stream fileStream, string contentType) : base(contentType)
{
if (fileStream == null)
{
throw new ArgumentNullException("fileStream");
}
this.FileStream = fileStream;
}
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
using (this.FileStream)
{
byte[] buffer = new byte[0x1000];
while (true)
{
int count = this.FileStream.Read(buffer, 0, 0x1000);
if (count == 0)
{
return;
}
outputStream.Write(buffer, 0, count);
}
}
}
请注意using
。当您从控制器调用File(dg.GetDocumentStream(), "text/plain", filename)
时,这将调用构造器,该构造器将流存储到一个公共属性中,该属性在呈现期间被释放。
结论:您不需要担心使用dg.GetDocumentStream()
处理获得的流。
发布于 2010-06-23 14:20:53
为了补充Darin has said,重要的是要注意这个概念:
public Stream GetDownloadFile(...)
{
using (var stream = new MemoryStream()) {
return stream;
}
}
public Stream GetDownloadFile(...)
{
using (var generator = DocumentGenerator.OpenTemplate(path))
{
// Document manipulation.
return File(generator.GetDocumentStream(), "text/plain", filename);
}
}
不管你如何在你的方法中使用它,using块确保Dispose总是被调用,当你考虑使用using块的结果作为返回语句时,这一点很重要,它不会阻止它被释放……
https://stackoverflow.com/questions/3084366
复制相似问题