Logger
несет ответственность за то, чтобы не блокировать абонента. Для этого можно использовать много разных стратегий. Вы не хотите превращать эти стратегии в класс, который их использует.
Я бы помещал сообщение в BlockingCollection<T>
, и один поток ввода-вывода записывал его на диск.
Я также рекомендую имитировать существующий интерфейс ведения журнала, например, Common.Logging ILog
, чтобы вы могли легко переключиться на существующую среду ведения журнала, если ваши требования «без сторонних разработчиков» когда-либо будут отменены. *
Что-то вроде:
class AsyncLogger:ILogger
{
public AsyncLogger(ILogger backingLogger)
{
new Thread(()=>
{
while(true)
{
var data=_queue.Take();
_backingLogger.WriteData(data);
}
}
).Start();
}
public void WriteData(string data)
{
_queue.Enqueue(data);
}
}
(я пропустил такие вещи, как условие завершения для потока ввода-вывода, поля, обработка нескольких регистраторов, ...)