这是一个非常简单的示例,我如何将 a 返回Stream
到 ASP.NET MVC:
public ActionResult DownloadData(...)
{
using(var lib = new SomeLibrary())
{
// do some stuff...
var stream = new MemoryStream();
lib.SaveAs(stream);
stream.Position = 0;
return File(stream, "contenttype", "filename");
}
}
问题在于,MemoryStream
它将分配在大堆对象区域中,而在 32 位系统上,OutOfMemoryException
由于 RAM 碎片会阻止分配大内存块,即使有足够的内存,它也会很快引起。在 64 位系统上,这种方法也很慢。
我想要的只是返回一个流,类似于这个
public ActionResult DownloadData(...)
{
using(var lib = new SomeLibrary())
{
// do some stuff...
return File(lib.Stream, "contenttype", "filename");
}
}
但是,该using
语句将.Dispose()
在我的数据返回之前调用。如果我完全删除该using
语句,那么库将锁定资源,直到垃圾收集器清理内存。
Stream
我认为最好的解决方案是使用只复制源流并在最后调用的泛型.Dispose()
:
public ActionResult DownloadData(...)
{
var lib = new SomeLibrary()
try
{
// do some stuff...
var stream = new CopyStream(lib.Stream, lib);
return File(stream, "contenttype", "filename");
}
catch(Exception)
{
lib.Dispose();
throw;
}
}
通用流应在关闭后调用.Dispose()
第二个参数。lib
Stream
在 .NET 或 NuGet 中是否有任何现有的实现?