Environment.exit() 调用后的流管理

Stream management after Environment.exit() invocation

我在 Whosebug 中搜索 try-finallyusing 块以及使用它们的最佳实践是什么。 我在评论 here 中读到,如果您的应用程序通过终止进程突然终止,finally 块将 不会 被执行。

我想知道,using 块是否也是如此?例如,如果 using 块内发生 Environment.exit() 调用,流是否会关闭?:

//....
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();

甚至前面提到的例子?

不应该在 FileStream 的特定情况下有所不同,当您使用它的 BeginWrite() 方法时,模数是一个棘手的极端情况。它的终结器尝试完成写入任何仍存在于其内部缓冲区中的未写入数据。然而,这通常不是真的,例如,如果您使用 StreamWriter, 会有所不同。

您要留给 .NET Framework 来决定的是,您是否真的打算猛拉地板垫并抓住写入文件的时间。或者它是否应该做最后一次尝试刷新任何未写入的数据。在 StreamWriter 的情况下,结果往往是令人不快的,something 在尝试读取写到一半的文件时失败的概率非零。

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