マルチスレッドC#アプリケーション用のロギングユーティリティクラスを作成しました。すべてのスレッドでのファイルへの安全なアクセスを確保するために、次のように私は静的オブジェクトにロックしています:私のアプリケーションの実行時にc#マルチスレッドロギング - ロックなし
private static readonly object locker = new object();
public static void WriteLog(String message, params Object[] args)
{
try
{
string filename = m_baseDir + GetFilenameYYYMMDD("_LOG", ".log");
lock (locker)
{
System.IO.StreamWriter sw = new System.IO.StreamWriter(filename, true);
String msg = String.Format(message, args);
sw.WriteLine(System.DateTime.Now.ToString() + " -" + msg);
sw.Close();
}
}
catch (Exception ex) { Console.WriteLine(ex); }
}
をしかし、私はまだsw
を初期化ライン上のSystem.IO.Exception
を取得しています変数。
System.IO.IOException:プロセスが別のプロセスで使用されているため、 'C:\ MyApp \ bin \ Debug \ Logs \ MyApp_2017_09_18_LOG.log'ファイルにアクセスできません。 System.IO .__ Error.WinIOError(のInt32 errorCodeを、文字列maybeFullPath)
で でも、私はログ内のメッセージを得るか、そう一部スレッド(複数可)ファイルに書き込むことができなければなりません。
どのようにしてすべてのスレッドがファイルにアクセスできるように修正できますか?
リソースを解放するようにusingステートメントでラップしてみてください。 – Nkosi
ちょうどあなたの好意を... https://github.com/serilog/serilog-sinks-file –
私が疑う最初のことは、StreamWriter自体です。 それを廃棄してみてください( "using"ステートメントの中で使用する方が良い) – Wr4thon