在Environment.exit()调用之后进行流管理

时间:2015-01-07 15:19:22

标签: c# filestream using try-catch-finally

我在StackOverflow中搜索try-finallyusing块,以及使用它们的最佳做法。 我在评论here中读到,如果您的申请因终止流程而突然终止,则finally阻止

会被执行。

我想知道,这同样适用于using块吗?例如,如果在Environment.exit()块内发生using调用,流会被关闭吗?:

//....
using (FileStream fsSource1 = new FileStream(pathSource,
        FileMode.Open, FileAccess.Read))
{
  //Use the stream here
  Environment.exit();
}

作为对它的第二个想法,并且知道CLR 垃圾收集器可能会处理流对象,如果在程序调用中没有正确关闭,是否有必要关闭代码中的流,如果程序在流使用完成后肯定会被终止?

例如,之间是否有任何实际区别:

//....
using (FileStream fsSource1 = new FileStream(pathSource,
        FileMode.Open, FileAccess.Read))
{
  //Use the stream here
}
Environment.exit();

//....
FileStream fsSource1 = new FileStream(pathSource, FileMode.Open, FileAccess.Read);
//Use the stream here
Environment.exit();

甚至是前面提到的例子?

1 个答案:

答案 0 :(得分:2)

不应该在FileStream的特定情况下有所不同,当你使用它的BeginWrite()方法时,模块化一个棘手的角落情况。其终结器尝试完成写入其内部缓冲区中仍存在的任何未写入数据。然而,这通常不正确,如果您使用StreamWriter,有所作为。

你要离开.NET Framework来决定你是否真的想要扯下地板并抓住写文件。或者它是否应该进行最后一次尝试来清除任何未写入的数据。 StreamWriter的结果往往是一个令人不愉快的结果,某些在尝试读取半写文件时会失败的非零赔率。

始终明确,如果您想确保不会发生这种情况,那么您需要确保正确调用Close()或Dispose()方法。或者删除文件。