8

我对我的编程知识感到非常沮丧,但我们真的需要处理 FileStream Object 吗?

我问的原因是因为代码在 100 次中抛出“文件正在被另一个进程使用”异常,并且有一段时间好像我再次尝试(使用文件流下载文件)它工作正常。

请参阅此问题的代码。

因为它只在 100 次左右发生一次,这让我很困惑,而且它发生在生产服务器上,所以根本无法调试,但在我的开发机器上完美运行......

4

3 回答 3

6

一般规则是处置所有一次性用品。

在 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);
}
于 2013-09-18T11:31:56.420 回答
6

当然,你需要处理所有一次性的东西,除非你有很好的理由不处理。

默认情况下将所有内容放入一个using块中。如果您Close手动调用,这是代码异味。

于 2013-09-18T11:18:23.297 回答
1

如果一个类实现了IDisposable,那么您应该将其处理掉,以便尽快关闭/清理任何资源,而不是依赖垃圾收集器。更好的是,将它包装在一个using块中,这样即使发生异常它也会关闭。

using (var stream = new FileStream(...))
{
   // do stuff with stream
}
于 2013-09-18T11:19:38.600 回答