BinaryReader或Writer.Close()未正确关闭C#

BinaryReader或Writer.Close()未正确关闭C#,c#,filestream,binaryreader,binarywriter,C#,Filestream,Binaryreader,Binarywriter,我有一个表单应用程序,它执行模拟并不断地读/写二进制文件。如果你让它运行的话,一切都很好。但是,如果表单关闭/模拟中止,则文件流未正确关闭-使文件处于锁定状态。 有没有办法确保所有溪流都关闭?我尝试了以下方法-但没有效果。。。 提前多谢了, T 您确定知道continue关键字的用途吗?请注意,这将继续下一个循环,而不是下一个代码块。因此,如果在关闭envbindead时发生异常,您将不会进入块以关闭envbindwrite,而是继续执行AllBldgs中的下一项 要消除所有异常并仍然尝试关闭所

我有一个表单应用程序,它执行模拟并不断地读/写二进制文件。如果你让它运行的话,一切都很好。但是,如果表单关闭/模拟中止,则文件流未正确关闭-使文件处于锁定状态。 有没有办法确保所有溪流都关闭?我尝试了以下方法-但没有效果。。。 提前多谢了, T


您确定知道
continue
关键字的用途吗?请注意,这将继续下一个循环,而不是下一个代码块。因此,如果在关闭
envbindead
时发生异常,您将不会进入块以关闭
envbindwrite
,而是继续执行
AllBldgs
中的下一项

要消除所有异常并仍然尝试关闭所有二进制写入程序,您可以编写:

foreach (Building B in AllBldgs)
{
    try
    {
        EnvBinRead.Close();
    }
    catch (Exception exp)
    { 
        Console.WriteLine("Closing EnvBinRead failed!" + exp.ToString());
    }

    try
    {
        EnvBinWrite.Close();
    }
    catch (Exception exp)
    { 
        Console.WriteLine("Closing EnvBinWrite failed!" + exp.ToString());
    }

    try
    {
        BinRead.Close();
    }
    catch (Exception exp)
    { 
        Console.WriteLine("Closing BinRead failed!" + exp.ToString());
    }

    try
    {
        BinWrite.Close();
    }
    catch (Exception exp)
    { 
        Console.WriteLine("Closing BinWrite failed!" + exp.ToString());
    }
}

请注意,简单地吃异常永远不是一个好主意。如果您不关心读卡器或写卡器是否可以关闭,请在按照注释中的建议关闭它之前检查它是否已初始化。

您应该调用dispose关闭BinaryReader和Writer

说明:

StreamReader、StreamWriter、BinaryReader和BinaryWriter
当您调用dispose时,它们都会关闭/处置它们的底层流。但是,如果读写器只是垃圾收集,它们不会处理流-您应该始终处理读写器,最好使用
using
语句。(事实上,这些类都没有终结器,也不应该有终结器。)

就我个人而言,我也更喜欢流的using语句。您可以使用不带大括号的语句进行嵌套:

using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}

<>虽然流的<代码>使用语句有点多余(除非<代码> StreamReader <代码>构造函数抛出异常),但我认为最好的做法是,如果你去掉<代码> StreamReader <代码>,直接在稍后的日期使用流,您已经有了正确的处理语义。

对流使用block总是很好的,使用后立即关闭它们。

是否出现任何异常?没有,因为您将它们全部吃掉。移除try..catch块并查看是否出现任何错误。啊,好的。。。抱歉,我是新来编码的-我使用了try-catch,因为读写器并不总是初始化的。。。将在不使用try catch的情况下尝试-感谢您的回复检查它们是否在关闭之前初始化。。。Try/catch应该作为最后手段使用,而不是解决所有问题的解决方案。这段代码没有任何意义。您有四个流,您试图在一个完全不相关的循环中关闭每一个流(多次!),同时您正在
继续
捕获,中止所有其余的关闭。-从这段代码中我们甚至不清楚您想要实现什么。+1,因为这可能是问题的根源。尽管如此,我还是建议使用异常是一件坏事,比如
if(BinRead!=null)BinRead.Close()BinRead
可能未初始化,则最好使用code>。谢谢!如何检查是否发生异常?使用try-catch,但说continue意味着跳过所有其他内容,直接转到finally。在catch块中,不要说continue,让它显示一个消息框,说明有错误或其他错误-如果发生异常,则执行
catch
块。您可以使用
Debug.WriteLine
Trace.WriteLine
显示消息或记录错误。我编辑了我的答案,给你一个想法。你也应该删除循环。这里没有理由。除非你有一个真正定制的
IEnumerable
实现,当你迭代它时会产生副作用,否则我无法理解你为什么要把它放在那里在某些情况下,它永远不会尝试关闭任何文件,而在许多其他情况下,它会尝试多次关闭它们。实际上,你并不知道。当您在读/写流之后立即想要关闭流时,建议使用
using
,但在某些情况下,流可能需要在应用程序的整个生命周期内打开。在这种情况下,根本不能使用
using
using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}