-1

シミュレーションを実行し、常にバイナリ ファイルを読み書きするフォーム アプリケーションがあります。それを実行すると、すべてが正常に機能します。ただし、フォームが閉じられたり、シミュレーションが中止されたりすると、ファイル ストリームが適切に閉じられず、ファイルがロックされたままになります。すべてのストリームが閉じていることを確認する方法はありますか? 私は次のことを試しました-しかし、それは効果がありません...事前にどうもありがとう、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; }
            }
        }
4

3 に答える 3

7

continueキーワードの意味を知っていますか? これは、次のコード ブロックではなく、次のループに続くことに注意してください。そのため、終了時に例外が発生した場合、終了するブロックには入ら、 から次の項目に進みます。EnvBinReadEnvBinWriteAllBldgs

すべての例外を食べながら、すべてのバイナリ ライターを閉じようとする場合は、次のように記述します。

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());
    }
}

単に例外を食べることは決して良い考えではないことに注意してください。リーダーまたは書き込みを閉じることができるかどうかを気にしない場合は、コメントで提案されているように、閉じる前に初期化されているかどうかを確認してください。

于 2012-05-11T09:05:53.193 に答える
2

BinaryReader と Writer を閉じるには、dispose を呼び出す必要があります。

説明:

StreamReader, StreamWriter, BinaryReader and BinaryWriterDispose を呼び出すと、すべての基になるストリームを閉じる/破棄します。ただし、リーダー/ライターが単にガベージ コレクションされている場合、ストリームは破棄されません。リーダー/ライターは、できればusingステートメントを使用して常に破棄する必要があります。(実際、これらのクラスにはファイナライザーがありませんし、持つべきでもありません。)

個人的には、ストリームに対しても using ステートメントを使用することを好みます。中括弧なしで using ステートメントを非常にきれいにネストできます。

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

ストリームのusingステートメントは多少冗長ですが (コンストラクターが例外をスローしない限り) 、ストリームを削除して後日ストリームを直接使用する場合は、適切な処理が既にStreamReader行われているため、ベスト プラクティスと考えています。StreamReaderセマンティクス。

于 2012-05-11T09:08:37.217 に答える
1

ストリームに Using ブロックを使用し、使用後すぐにそれらを閉じることは常に良いことです。

于 2012-05-11T09:09:44.987 に答える