C# 关闭后可以为另一个对象调用Dispose()方法的泛型流
下面是一个非常简单的示例,我如何将C# 关闭后可以为另一个对象调用Dispose()方法的泛型流,c#,stream,C#,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;
流
返回到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()
。如果使用语句完全删除,则库将锁定资源,直到垃圾收集器清理内存
我认为最好的解决方案是使用一个通用的流
,它只需复制源流并在最后调用.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;
}
}
通用流应该在关闭后为第二个参数lib
调用.Dispose()
在.NET或NuGet中是否存在此类流的任何现有实现?可能我不太清楚您需要什么,但在您的情况下,不需要自己处理流(使用显式dispose()调用或使用关键字)
来自ASP MVC控制器的File helper方法被设计为返回流:它创建一个负责处理封装流的文件,并在其任务完成时执行
在本主题中,您可以在中找到Darin Dimitrov更好、更详细的答案。也许我不完全理解您需要什么,但在您的情况下,不需要自己处理流(使用显式dispose()调用或使用关键字)
来自ASP MVC控制器的File helper方法被设计为返回流:它创建一个负责处理封装流的文件,并在其任务完成时执行
关于这个话题,你可以在中找到达林·迪米特罗夫更好、更详细的答案。完全不清楚你为什么要寻找定制的东西。流类已经继承IDisposable并实现了一次性模式。当然,您应该使用using关键字来处理它,就像处理任何流一样。否则,它对内存使用没有任何影响,内存使用是由垃圾收集器管理的,而不是由程序管理的。完全不清楚为什么要寻找自定义的东西。流类已经继承IDisposable并实现了一次性模式。当然,您应该使用using关键字来处理它,就像处理任何流一样。否则,它对内存使用没有任何影响,内存使用由垃圾收集器管理,而不是由程序管理。