我对我的编程知识感到非常沮丧,但我们真的需要处理 FileStream Object 吗?
我问的原因是因为代码在 100 次中抛出“文件正在被另一个进程使用”异常,并且有一段时间好像我再次尝试(使用文件流下载文件)它工作正常。
请参阅此问题的代码。
因为它只在 100 次左右发生一次,这让我很困惑,而且它发生在生产服务器上,所以根本无法调试,但在我的开发机器上完美运行......
我对我的编程知识感到非常沮丧,但我们真的需要处理 FileStream Object 吗?
我问的原因是因为代码在 100 次中抛出“文件正在被另一个进程使用”异常,并且有一段时间好像我再次尝试(使用文件流下载文件)它工作正常。
请参阅此问题的代码。
因为它只在 100 次左右发生一次,这让我很困惑,而且它发生在生产服务器上,所以根本无法调试,但在我的开发机器上完美运行......
一般规则是处置所有一次性用品。
在 a 的特定情况下FileStream
,您不需要将其处置以关闭文件,您只需要使用该Close
方法即可。
但是,无论如何您都应该处置该FileStream
对象,因为它有一个终结器。这将从终结器队列中删除对象,并使其成为可以在单次传递中进行垃圾收集的普通对象。如果不释放,垃圾收集器必须运行该Finalizer
方法,并且直到稍后才能收集它,因此它会在内存中逗留更长时间。
因为无论如何你都应该处理对象,所以你可以把它放在一个using
块中。这将调用该Dispose
方法,该方法又将调用该Close
方法,因此您无需自己执行此操作:
using (System.IO.FileStream stream = System.IO.File.Create(Path + file.Name)) {
stream.Write(document, 0, document.Length);
}
当然,你需要处理所有一次性的东西,除非你有很好的理由不处理。
默认情况下将所有内容放入一个using
块中。如果您Close
手动调用,这是代码异味。
如果一个类实现了IDisposable
,那么您应该将其处理掉,以便尽快关闭/清理任何资源,而不是依赖垃圾收集器。更好的是,将它包装在一个using
块中,这样即使发生异常它也会关闭。
using (var stream = new FileStream(...))
{
// do stuff with stream
}