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

tim*_*ado -1 c# filestream binaryreader binarywriter

我有一个表单应用程序执行模拟并不断读取/写入二进制文件.如果让它通过,一切正常.但是,如果表单已关闭/模拟已中止,则文件流未正确关闭 - 文件将被锁定.有没有办法确保所有流关闭?我尝试了以下 - 但它没有效果......非常感谢,T

        public BinaryWriter BinWrite;
        public BinaryReader BinRead;

        public BinaryWriter EnvBinWrite;
        public BinaryReader EnvBinRead;       

public void theForm_FormClosing(object sender, FormClosingEventArgs e)
        {

            //Close all binary file reader/writers -- crashes if it cannot overwrite files
            foreach (Building B in AllBldgs)
            {
                try
                {
                    EnvBinRead.Close();
                }
                catch
                { continue; }
                try
                {
                    EnvBinWrite.Close();
                }
                catch
                { continue; }
                try
                {
                    BinRead.Close();
                }
                catch
                { continue; }

                try
                {
                    BinWrite.Close();
                }
                catch
                { continue; }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Tho*_*mar 7

您确定知道该continue关键字的用途吗?请注意,这将继续下一个循环,而不是下一个代码块.因此,如果关闭时发生异常EnvBinRead,则不会进入要关闭的块EnvBinWrite,而是继续执行下一项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());
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,仅仅吃异常并不是一个好主意.如果您不关心阅读器或写入是否可以关闭,请检查是否已按照注释中的建议关闭它之前对其进行了初始化.