2017-09-18 7 views
0

マルチスレッド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)

で でも、私はログ内のメッセージを得るか、そう一部スレッド(複数可)ファイルに書き込むことができなければなりません。

どのようにしてすべてのスレッドがファイルにアクセスできるように修正できますか?

+3

リソースを解放するようにusingステートメントでラップしてみてください。 – Nkosi

+0

ちょうどあなたの好意を... https://github.com/serilog/serilog-sinks-file –

+0

私が疑う最初のことは、StreamWriter自体です。 それを廃棄してみてください( "using"ステートメントの中で使用する方が良い) – Wr4thon

答えて

0

私は前のように同じ問題を抱えて:実行が行われた後

 sw.Flush(); 
     sw.Close(); 

:私はちょうどこれを使用

これも試してみることができますsw.Dispose();

希望します。

関連する問題