3

.net トレースは初めてです。

アプリケーションには 10 から 15 を超えるトレース ソースがあり、共有リスナー リストにはテキスト ファイル リスナーと SQL サーバー リスナーがあります。私の質問は、私が電話するかどうかです

 traceSource.TraceInformation("Sample information")

その後、呼び出し元のスレッドは、テキスト ファイル リスナーと SQL サーバー リスナーによって処理/トレースされるまでブロックされます。または、TraceSource にはロギング用のキューが内部的に含まれているため、呼び出しスレッドはすぐに解放され、ロギングはバックグラウンド スレッドで行われます。

基本的に、すべてのトレースリスナーによってログに記録されるまで、呼び出し元のスレッドがブロックされることは望ましくありません。そのように実装したい場合、カスタムリスナーを使用する必要がありますか?

4

1 に答える 1

0

トレースは、リスナーと同じくらいマルチスレッド セーフです。多くのスレッドがトレースを介して同じファイルに書き込もうとしている場合、競合が発生する可能性があります。現在のログ ファイルが既に開いている場合、一部のリスナーは別のログ ファイルに書き込みます。コンソール トレース リスナーへの書き込みの経験から、2 つのスレッドが同時にコンソールに書き込もうとすると、テキストがインターリーブすることがあることを知っています。これは、System.Diagnostics フレームワークのコードでブロックを強制するものは何もないことを意味します。

遅いリスナー ブロックをテストするには、カスタム リスナーを実装することで経験的に判断できます。この基本クラスをお勧めします。これにより、カスタム リスナーを作成するために、実際には最大 2 つのメソッドをオーバーライドするだけで済みます。Thread.Sleep(6000) を追加し、すべてのスレッドがブロックされるかどうかを確認します。

その場合は、トレース呼び出しを、Task.Run、Task.StartNew、または新しい Thread/Start など、ある種のファイア アンド フォーゲット呼び出しに入れることを検討することをお勧めします。ただし、新しいスレッドを作成するオーバーヘッドにより、数ミリ秒のブロックよりもパフォーマンスが低下する可能性があると思います。ここに 1 つの関連する質問があります。

于 2012-10-10T00:39:49.607 に答える