Я хочу заменить XmlTraceListener Microsoft по умолчанию на прослушиватель, который переключает файлы на основе ограничения размера файла или текущей даты. Я хочу сохранить формат файла XmlTraceListener по умолчанию, чтобы я мог открывать файлы с помощью инструмента ServiceTraceViewer.Thread-safe прослушиватель трассировки на основе XmlWriterTraceListener
Я нашел статью http://www.codeproject.com/Articles/30956/A-Rolling-XmlWriterTraceListener, но из комментариев кажется, что у этого слушателя есть некоторые неустойчивости даже после того, как были предложены исправления.
Тогда я нашел собственную реализацию Microsoft по CircularListener http://msdn.microsoft.com/en-us/library/aa395205.aspx
Я хотел расширить его, но заметил, что он имеет
static CircularStream m_stream = null;
, а затем эта переменная осуществляется доступ без замков. При чтении http://msdn.microsoft.com/en-us/library/ms733025.aspx я обнаружил, что даже сам XmlWriterTraceListener не является потокобезопасным. MSDN говорит:
Поскольку System.Diagnostics.XmlWriterTraceListener не поточно- источник трассировки может блокировать ресурсы исключительно при выводе следов. Когда многие потоки выводят трассировки в источник трассировки, сконфигурированный , чтобы использовать этот прослушиватель, может возникнуть конфликт ресурсов, что приводит к существенной ошибке производительности в . Чтобы решить эту проблему, вы должны: реализовать пользовательский прослушиватель, который является потокобезопасным.
Так по существу это означает, что TraceListener.IsThreadSafe
имущество остается в качестве false
для XmlWriterTraceListener, так тогда система высшего отслеживании уровня блокировки каждый раз, когда TraceData/TraceEvent называется, я прав?
Будет ли какая-либо польза от добавления блокировки вокруг этого static CircularStream m_stream
и возврата true
Форма override IsThreadSafe
property? Или, может быть, это будет то же самое, что уже сделано в XmlTraceListener?
Что я могу сделать, чтобы сделать CircularTraceListener потокобезопасным и эффективным?
Вы пробовали его в конфигурации по умолчанию с несколькими потоками и определили, что поведение блокировки вызывает проблему? Если вы хотите добавить синхронизацию, вам нужно сделать намного больше, чем просто блокировать объявление этой переменной. Вам придется блокировать каждый доступ к потоку. –