2011-02-01 11 views
0

私はアプリケーションのログインを有効にするために.Net tracelistenerを使用しています。私のアプリケーションはマルチスレッドの.Netサービスです。重い負荷の下で.Netトレースは、次のエラーをスローします。 これはなぜ起こっているのか、これに対する解決策があるのか​​誰にも分かっていますか?.Net tracelistenerの問題

System.UnhandledExceptionEventArgs 
System.IO.IOException 
mscorlib 
The process cannot access the file 'C:\035_Prg.log' because it is being used by another process. 

Server stack trace: 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options) 
    at System.IO.StreamWriter.CreateFile(String path, Boolean append) 
    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) 
    at System.IO.StreamWriter..ctor(String path, Boolean append) 
    at System.Diagnostics.TraceListener.WriteHeader(String source, TraceEventType eventType, Int32 id) 
    at System.Diagnostics.TraceListener.TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, String format, Object[] args) 

    at System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int32 id, String format, Object[] args) 
    at System.Diagnostics.TraceSource.TraceInformation(String message) 
+0

サービスをホストしているサービスまたはIISを停止しようとしましたか、タスクマネージャでasp_netプロセスを停止しましたか? – Kuncevic

+0

同じTraceListenerを2回追加していませんか?これはこの種の問題を引き起こす可能性があります。それ以外の場合は、使用しているTraceListenerクラスとは何ですか? –

+0

私はtracelistenersのTracesourceクラスを使用しています。 – user597955

答えて

1

これを防ぐのに役立つTraceListenerには、さまざまな種類のaspects of thread-safetyがあります。彼らは、個々のリスナーのレベルで、あなたが書いているリスナーのコレクションにグローバルにロックすることも、TraceListener announces itself as thread safeがある場合にはフレームワークによってロックを全く持たせることもできません。フレームワークがしないことはファイルそのものをロックすることなので、マシン上の他のプロセスやファイルをロックしている可能性のあるアプリケーション内の他のコードなどの明白な部分を確認してください。

また、トレースの粒度を変更すると役立つかどうかを検討することもできます。私は、通常、各モジュールやアプリケーションのアクティビティに別々の静的TraceSourcesを定義します。これを実行し、UseoryLockをオフにすると、his articleでRoryが示唆するように、競合を減らすことができます。