2009-07-15 8 views
1

Webアプリケーションがあり、ファイルに情報が記録されています。私は単純なスレッドセーフ非ブロッキングファイルロガークラスをC#で探しています。私はスレッディングに関する経験がほとんどありません。 Log4Net、Enterprise Library Logging Block、ELMAHのような優れたロギングコンポーネントがあることはわかっていましたが、私のアプリケーションに外部依存は望んでいません。このキュー実装の使用について考えていたhttp://www.codeproject.com/KB/cpp/lockfreeq.aspxCでのスレッドセーフなノンブロッキングファイルロガークラス#

答えて

0

FileStream.BeginWriteメソッドは、システムによって管理されているスレッドに書き込み操作をプッシュします。それは簡単なビットです。

メッセージを同期キューに入れ、EndWriteメソッドで次のアイテムをキューから取り出すと、アプリケーションに関するすべてのログがスレッド外になります。

最後のステップは、メッセージをキューに入れてイベントを設定することで、EndWriteが次のメッセージを探すときにキューが空の場合、イベントが設定されるのを待つことができます。

1

あなたは外部ライブラリを使用したくない場合、あなたは私がオフィスで私のプロジェクトでは、単純なロギングメカニズムをやったTraceクラス

+1

外部依存関係が必要ない場合は、Traceクラスに投票します。また、多くの開発者は、アプリケーションの複雑さを考慮せずにLog4netやEnterprise Libなどのコンポーネントを追加するだけです。 .NETのDebugクラスとTraceクラスは、多くの中小規模のアプリケーションで十分です。設定項目を変更するか、独自のTraceListenerを記述して、動作をカスタマイズできます。 – A9S6

0

を使用することができます。

共有クラス(静的C#)があります。

私はこのクラスの中に同期キューを持っていて、それ自身のスレッドを持っています。

このスレッドの内部では、自分で定義したWaitTime(私は250msを使用します)でAutoresetEventを使用しています。

このResetEventがタイムアウトすると、現在キューにあるもの(DeQueueを使用)が収集され、それぞれがFileに書き込まれます。

覚えておくべきこと...ディスクに書き込んだ時間ではなく、エントリが入った日付を保持できるクラスまたは構造体を用意してください。

アプリケーションをすぐに終了したい場合は、イベントをスリープから外して正常に終了するようにイベントを設定するメソッドを公開します。

+0

いくつかのコードを表示できますか? – M4N

+0

私は同じソリューションを思いついたのですが、DeQueueを使ってキューをブロックすると、ロギングをブロックすることに気付きました。 250ミリ秒ごとに起こっても、あなたはまだブロックしています。 – tesla

関連する問題