2016-09-09 13 views
0

こんにちは、ありがとうございます。 今回は、私が書いているプログラム(C#)に興味があり、アドバイスを聞きたいと思っています。 通常のプログラム(マルチスレッドではありません)を作成していますが、タイマー(System.Timers.Timer)を追加しましたタイマー、ファイル、競合状態?

また、StreamWriterを使用してファイルに書き込みます。私はこれをこのように開きます。

ファイルが存在する場合は、それが追加されていない場合は作成されます。

後、私はこのようなファイルに

logStream.WriteLine(message); 

を書くしかし、私は、主な機能両方から、タイマーによって呼び出される関数からストリームに書き込みます。

問題の症状

私のプログラムは、私が「閉じられたファイルにアクセスできません」と言ったストリームをフラッシュまたは書き込み時に時々エラーを投げると、他の回「閉じたTextWriterにアクセスすることはできませんされて...ファイルは問題なく書かれ続ける、しかし不思議

(?「したTextWriter」とは何である)。(でも、「閉じられたファイルにアクセスできません」というメッセージが想定閉じられたファイルに書かれている)

私はTimerの内部の仕組みに精通していない(私はそれがsepを実行していると思うarateスレッド?)

私の質問は

であるが、それは複数のスレッドからのStreamWriterを使用することは可能ですか? (この場合、メインとタイマーの1つ) 競合状態やそれに似た問題が起こっている可能性はありますか?


もう一つ:私は、論理ミスを犯し、クローズして、ファイルに私はそれを書きたいたびに再度開きます。はい、間違いであり、修正する必要があります。しかし、もし私がこれを訂正すれば、私は上記のエラーがより深刻な欠陥を隠すことなく消えるでしょう。

私の疑惑は、私は、ファイル私はそれを書くごとに時間を開閉おりますので、多分両方のスレッドが

すべてのヘルプは大幅に

+0

質問の1つ:StreamWriterは特定のTextWriterです。 –

+2

ロギング実装を作成しようとしていますか?なぜあなたは使っていないのですか?NETのビルトイン診断APIまたはlog4netのようなロギングライブラリ?ロギングライブラリは、複数のスレッドからのログ要求を受け入れる必要がありますが、ログファイルを破損することなくすべてのエントリを正しく書き込む必要があります。 –

答えて

1
を理解されるであろう間違った時間にそれらにアクセスしようとするということです

このシナリオでファイルを閉じて開くと、疑わしい競争条件が作成されます。ストリームを開いたままにしてオブジェクトをスレッドに渡すことはできません。これは、別のスレッドから呼び出した場合に同様の問題が発生する可能性があるためです。あなたの最善の解決策は、送信したものを書くスレッドセーフな方法を使用したままです。

ロックはクラスのすべてのインスタンスからアクセスできる必要があるため、メソッドは静的です。

private static ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim(); 

public static void AppendToFile(string path, string text) 
{ 
    // Set to locked (other thread will freeze here until object is unlocked 
    readerWriterLockSlim.EnterWriteLock(); 

    try 
    { 
     // Write that will append to the file 
     using (StreamWriter sw = File.AppendText(path)) 
     { 
      // append the text 
      sw.WriteLine(text); 
      sw.Close(); 
     } 
    } 
    finally 
    { 
     // Clear the lock 
     readerWriterLockSlim.ExitWriteLock(); 
    } 
} 
+1

さらに、ロギングライブラリを使用してください。または、複数のスレッドからのメッセージをキューに入れ、単純なライターを使用して1つずつ書き込むActionBlock