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关键字来处理它,就像处理任何流一样。否则,它对内存使用没有任何影响,内存使用由垃圾收集器管理,而不是由程序管理。