簡體   English   中英

關閉后可以為另一個對象調用Dispose()方法的通用Stream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM