マルチスレッドでファイル書き込み
マルチスレッドで動作するアプリでは、ログの書き込みなどを行う際にファイルアクセスの競合が起こる可能性があります。そこで、ログを取る処理で排他制御を行うようにします。
古い環境に対応しなくてはいけなかったので、ソースコードは .NET Framework 2.0 準拠になります。
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Threading; namespace hoge { class Logger { // マルチスレッド対応のシングルトンパターンを採用 private static volatile Logger instance; private static object syncRoot = new Object(); private Logger() { } // ロック用のインスタンス private static ReaderWriterLock rwl = new ReaderWriterLock(); // シングルトンパターンのインスタンス取得メソッド public static Logger Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) instance = new Logger(); } } return instance; } } public void log(string msg) { StreamWriter sw; // ここからロック rwl.AcquireWriterLock(Timeout.Infinite); try { using (sw = StreamWriter("hoge", true, Encoding.GetEncoding("UTF-8"))) { sw.WriteLine(msg); } } finally { // ロック解除は finally の中で行う rwl.ReleaseWriterLock(); } } } }
microsoft のドキュメントからそのまま持ってきたコードの組み合わせですが、これでどこからでも
Logger.Instance.log("何かのメッセージ");
のような形式で、競合を気にせずにログの書き込みが行えます。