2017-06-30 5 views
-1

ログファイルを管理するために、真夜中にロールオーバーを使用してログを記録するコードスニペットがオンラインで見つかりましたが、管理できない場合があります。ソリューションに遭遇したかもしれませんが、実装方法はわかりません。 StreamWriterを使用してファイルを書き込みます。ObjectDisposedOfロールオーバーログライターでの盛り上がり

必ずしもそうではありませんが、多くの場合、「閉じられたファイルを開くことができません」というObjectDisposed例外が発生します。前回を閉じ、新しいファイルを作成するための責任があるクラスの一部は次のとおりです。

private void checkRollover() 
    { 
     // If the date has changed, close the current stream and create a new file for today's date 
     if (_currentDate.CompareTo(System.DateTime.Today) != 0) 
     { 
      try 
      { 
       _traceWriter.Close(); 
       _traceWriter.Dispose(); 
       _traceWriter = new StreamWriter(generateFilename(), true); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("This error: " + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 
    } 

.closeはすでにこれを実行したり、それは何か他のものかもしれないとして、それは終わりであるため.disposeのですか?私が言ったように、本当にこれによって困惑した、なぜこれが起こっているかもしれないのかについてのアドバイスは高く評価されます。必要な場合は、クラス全体をここに投稿することができます。

EDITもう一度エラーが発生することはありませんでしたが、今度はそれが行われました。また、私はそこ

System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder) 
at System.IO.StreamWriter.Dispose(Boolean disposing) 
at System.IO.StreamWriter.Close() 
at FixInterface.RollOverTextWriter.checkRollover() 
+0

[ストリームオブジェクトに対してClose()またはDispose()をコールする必要がありますか?](https://stackoverflow.com/questions/7524903/should-i-call-close-or-dispose-for-stream) -objects) –

+2

スタックトレースで完全な例外を送信し、例外が最初に発生するコードを確認します。 –

+0

上記のコードはスレッドセーフではないため、同じ_traceWriterインスタンスにアクセスする複数のスレッド間の競合状態が考えられます。 – Joe

答えて

0

から)(_tracewriter.Disposeを削除し、この答えをチェックアウト:後者はその暗黙的に行いますので、https://stackoverflow.com/a/7525134/7004050

Close()Dispose()を呼び出さないでください。

+1

しかし、ストリームを「好きなだけ」、「任意の順序で」呼び出すことができるということは、コードを読んでいると明らかになっています。 _ "この場合、私はエラーが発生しているので、それは問題ではないと私を信じさせてくれます。 – MihkelT

+0

はい、しかし、 'StreamWriter'の' Close() 'はガベージコレクタを呼び出して、割り当てられたメモリを物理的にクリアします。他のどのようなタスクがあるかによっては、これをGCですぐに実行できませんでした。 'Dispose()'なしでコードを試してください。 –

+0

複数回呼び出すには、[安全にする](https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose)をディスポーザル/クローズしてください。したがって、これは少し良いアドバイスです([CA2202](https://blogs.msdn.microsoft.com/tilovell/2014/02/12/the-worst-code-analysis-rule-thats-recommended-ca2202/) )これはこの問題の原因ではありません。 –

関連する問題