2014-07-30 3 views
4

Согласно http://msdn.microsoft.com/en-us/library/ms733025.aspx XmlWriterTraceListener не является потокобезопасным. (Я знаю, что Microsoft.VisualBasic.Logging.FileLogTraceListener есть, но я думаю, что формат XmlWriterTraceListener гораздо читабельнее с помощью Microsoft Service Trace Viewer).Насколько «релевантным» является безопасность, не связанная с потоком XmlWriterTraceListener?

Тем не менее, я использую его только для настольных приложений с потоком пользовательского интерфейса и не более 2 BackgroundWorkers, используя XmlWriterTraceListener как Источник Слушатель в то же время. Насколько «релевантным» является безопасность, не связанная с потоком в этом случае, учитывая влияние производительности? Отслеживание сообщений написано относительно пугающе, т. Е. Не каждую секунду.

Редактировать: Пользовательский интерфейс и рабочий стол (ы) фона используют разные источники трассировки (каждый создает свои собственные). TraceListener (на данный момент FileLogTraceListener, поскольку я был уверен в безопасности потоков) является статическим общедоступным свойством в классе App. Я добавляю его в TraceSources в конструкторах классов, владеющих TraceSource.

+5

«Напуганное» никогда не имеет ничего общего с безопасностью потока. Это просто затрудняет диагностику ошибок. Нет, это не потокобезопасно, и вы * должны * использовать блокировку для предотвращения одновременного вызова нескольких потоков. –

+0

Насколько уместен? Ну, так важно, как вы хотите это сделать. Несмотря на то, что записи происходят «не каждую секунду», все же существует вероятность того, что два потока будут пытаться писать в одно и то же время. Результатом этого будет либо отказ от события, либо отказ приложения, в зависимости от конкретной реализации. Без дополнительных подробностей трудно сказать. – Darek

+0

Спасибо за комментарии. Объяснил немного больше в вопросе. Чтобы сделать его потокобезопасным, мне нужно было бы/создать класс-оболочку, который блокирует прослушиватель во время вызовов метода Trace *? –

ответ

2

Класс Trace имеет свойство, UseGlobalLock, которое должно быть true, если основной слушатель (а) сообщает, что они не являются потокобезопасными.

Другими словами, если вы используете трассировки слушателя, который не является поточно-с классом Debug или Trace, то эти классы (Trace/Debug) будет убедиться, что основной слушатель обрабатывается в резьбовых безопасный способ.

Другими словами, ваш вопрос о том, насколько уместен недостающий поток безопасности для прослушивателя трасс, тогда ответ не очень. Это может быть актуально с точки зрения производительности, если вы создаете прослушиватель, может быть небольшая производительность, чтобы добиться того, чтобы прослушиватель был потокобезопасным, если это можно обрабатывать по-другому, чем просто глобальная блокировка вокруг него.

Если вы не знаете, вы можете заставить это свойство быть true, и в документации есть пример того, как сделать это здесь, Trace.UseGlobalLock Property:

<configuration> 
    <system.diagnostics> 
    <trace useGlobalLock="false" /> 
    </system.diagnostics> 
</configuration> 

Обратите внимание, что если вы используете прослушиватель трассировки объект с чем-то иным, чем класс Trace, тогда этот ответ неприменим.

Обратите внимание, что класс Debug использует ту же основную структуру, что и класс Trace, но не обладает этим свойством.

Текущая реализация Debug и Trace заключается в том, что они оба обертывают внутренний статический класс, и, таким образом, если вы добавляете прослушиватель отладки, он добавляется к трассировке и наоборот. Таким образом, свойство Trace.UseGlobalLock применимо также для Debug.WriteXYZ.

+0

Что касается «... если вы используете объект прослушивания трассировки с чем-то отличным от класса Trace ...»: Если я правильно понимаю это означает, что глобальная блокировка не будет применяться, если я получаю доступ к слушателю напрямую (вызов 'listener.Write (text)' например, из моего кода). Я использую прослушиватель трассировки через созданные мной файлы TraceSource. Применяется ли к ним GlobalLock? –

+0

TraceSource завершает проверку свойства глобальной блокировки, поэтому, по-видимому, да, но я не уверен, что могу это прочитать из документации. Возможно, это недокументированное поведение. –

Смежные вопросы