c# - 如何从一个方法返回一个流,知道它应该被释放?

标签 c# .net stream using idisposable

我有一个将 FileStream 作为输入的方法。此方法在 for 循环内运行。

private void UploadFile(FileStream fileStream)
{
    var stream = GetFileStream();
    // do things with stream
}

我有另一种创建并返回 FileStream 的方法:

private FileStream GetFileStream()
{
    using(FileStream fileStream = File.Open(myFile, FileMode.Open))
    {
        //Do something
        return fileStream;
    }
}

现在,当我尝试访问返回的 FileStream 时,第一个方法抛出一个 ObjectDisposedException,可能是因为它已经关闭,因为我正在使用“using”来正确处理流。

如果我不使用“using”而是按如下方式使用它,则 FileStream 将保持打开状态并且循环的下一次迭代(对同一文件进行操作)会抛出异常,告知该文件已在使用中:

private FileStream GetFileStream()
{
    FileStream fileStream = File.Open(myFile, FileMode.Open);
    //Do something
    return fileStream;
}

如果我使用 try-finally block ,我在 finally 中关闭流,那么它也会抛出 ObjectDisposedException

如何有效的返回文件流并关闭?

最佳答案

当您从方法返回一个 IDisposable 时,您将处置它的责任委托(delegate)给您的调用者。因此,您需要在流的整个使用过程中声明您的 using block ,在您的情况下,这可能跨越 UploadFile 调用。

using (var s = GetFileStream())
    UploadFile(s);

关于c# - 如何从一个方法返回一个流,知道它应该被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32058317/

相关文章:

.net - 虚拟机的 GA 框架

java - 以不同的速率从 InputStream 中多次读取

c# - 在编辑 WPF DataGrid 单元格期间显示弹出窗口

c# - JSON.Net:反序列化多态类型而不指定程序集

c# - 什么是最好的 MVC3 解决方案结构?

c# 包含单词异常编号

.net - 无法设置 x :Name ="Root" on UserControl

c# - 编辑模式下具有 DropDownList 列的 Datagrid

java - 如何使用多个数据源获得 3 个线程池?

node.js - 在单个 block 上执行管道操作(node-wav)