静的な単純な単純なロギング クラスがあります。ただし、すべての呼び出しが同じファイルに書き込もうとするため、スレッドセーフではありません。私はこれらの例外を受け取ります:
The process cannot access the file 'logfile.txt' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
...
スレッドセーフにする最良の方法は何ですか?
public static class Logger
{
private static readonly string LOG_FILENAME = "logfile.txt";
private static readonly string LOG_FOLDER = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "App name");
private static readonly string LOG_FULLPATH = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "App name", LOG_FILENAME);
public static void LogMessageToFile(string msg)
{
msg = string.Format("{0:G}: {1}{2}", DateTime.Now, msg, Environment.NewLine);
File.AppendAllText(LOG_FULLPATH, msg);
}
}
ロギング機能として、コードのさまざまな部分からアクセスできるようにしたいと考えています (したがって、静的にすることを選択した理由)。ただし、スレッドセーフにするためには、lock() に共通のオブジェクトを常に渡す必要があると想像しています。これは、静的関数の目的を無効にしていると思います。それともそうではありませんか?