我有一个将 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/