[英]Generic Stream that can call Dispose() method for another object after closing
這是一個非常簡單的示例,如何將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位系統上,由於RAM碎片,即使有足夠的內存,這也會阻止分配大的內存塊,因此很快就會導致OutOfMemoryException
。 在64位系統上,此方法也很慢。
我想要的只是返回一個流,類似於此
public ActionResult DownloadData(...)
{
using(var lib = new SomeLibrary())
{
// do some stuff...
return File(lib.Stream, "contenttype", "filename");
}
}
但是,然后using
語句將在返回我的數據之前調用.Dispose()
。 如果我完全刪除了using
語句,那么該庫將鎖定資源,直到垃圾回收器清理內存為止。
我認為最好的解決方案是使用僅復制源流並在最后調用.Dispose()
的通用Stream
:
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中是否存在此類Stream
現有實現?
也許我不確定您到底需要什么,但是在您的情況下,不需要自己處理流(使用顯式Dispose()調用或using關鍵字)。
來自ASP MVC控制器的File helper方法旨在返回流:它創建一個FileStreamResult ,它負責處理封裝的流,並在完成其工作時將其處理。
關於此主題,您可以在此處找到Darin Dimitrov更好,更詳細的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.