【问题标题】:Stream management after Environment.exit() invocationEnvironment.exit() 调用后的流管理
【发布时间】:2015-01-07 15:19:21
【问题描述】:

我在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 Garbage Collector 如果在程序调用中没有正确关闭,可能会处理流对象,是否认为有必要关闭流在代码中,如果程序在流使用完成后确定终止?

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

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

甚至是前面提到的例子?

【问题讨论】:

  • 好的,这很有帮助,但问题有两部分:首先,如果我在 using 块中调用 Environment.Exit() 会发生什么,其次也是最重要的,有什么区别如果程序在使用后立即终止,是否有任何意义。
  • 您为什么正确处理它?这只是一个好习惯——一旦不再需要资源,就立即处理掉它们。如果您决定有一天扩展您的应用程序并忘记您尚未处置该特定资源这一事实怎么办?

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


【解决方案1】:

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

留给 .NET Framework 来决定的是,您是否真的打算猛拉地板垫并抓住写入文件的时间。或者它是否应该进行最后一次尝试刷新任何未写入的数据。在 StreamWriter 的情况下,结果往往是一个不愉快的结果,当它试图读取一个写一半的文件时,某物会倒下的可能性非零。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多