我是否需要处理FileStream对象?

时间:2013-09-18 11:16:47

标签: c# web-services

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

我要问的原因是因为代码在100个案例中抛出了“另一个进程正在使用的文件”异常,并且片刻似乎我再次尝试(使用文件流下载文件)它可以正常工作。

请参阅此question代码。

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

3 个答案:

答案 0 :(得分:3)

当然,除非你有充分的理由不处理,否则你需要处理一次性的所有东西。

默认情况下,将所有内容放入using块。如果您手动拨打Close,这就是代码味道。

答案 1 :(得分:1)

如果一个类实现IDisposable,那么你应该处理它,以便所有资源都被关闭/清理,而不是依赖于垃圾收集器。更好的是,将它包装在using块中,以便即使发生异常也会关闭它。

using (var stream = new FileStream(...))
{
   // do stuff with stream
}

答案 2 :(得分:1)

一般规则是处置一次性的所有东西。

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);
}