Я собираюсь использовать здесь совершенно иной подход, чем другие ответы, и предположим, что вы действительно хотите научиться писать лучший код с поддержкой потоков, а не ищите от нас сторонних предложений (даже если вы на самом деле можетев конечном итоге используйте один.)
Как уже говорили другие, вы создаете потокобезопасный TextWriter
, что означает, что вызовы WriteLine являются потокобезопасными, что не означает, что набор вызовов WriteLine
собираются быть выполнены как атомная операция.Я имею в виду, что нет гарантии, что четыре вызова WriteLine будут происходить последовательно.У вас может быть поточно-безопасный TextWriter
, но у вас нет поточно-безопасного Logger.Log
метода;) Почему?Потому что в любой момент во время этих четырех вызовов другой поток может решить также вызвать Log
.Это означает, что ваши WriteLine
вызовы будут не синхронизированы.Чтобы исправить это, используйте оператор lock
следующим образом:
private static readonly object _syncObject = new object();
public static void Log(string logMessage, TextWriter w) {
// only one thread can own this lock, so other threads
// entering this method will wait here until lock is
// available.
lock(_syncObject) {
w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
DateTime.Now.ToLongDateString());
w.WriteLine(" :");
w.WriteLine(" :{0}", logMessage);
w.WriteLine("-------------------------------");
// Update the underlying file.
w.Flush();
}
}
Итак, теперь у вас есть потокобезопасный TextWriter
И потокобезопасный Logger
.
Имеет смысл?