2012-02-29 3 views
1

Каждый TraceListener в пространстве имен System.Diagnostics (.NET 4) имеет свойство IsThreadSafe. Инфраструктура .NET Tracing решает использовать блокировку для синхронизации нескольких вызовов методам TraceListener Trace на основе этого свойства.DefaultTraceListener и безопасность потоков

Что необходимо для того, чтобы DefaultTraceListener был отмечен как не ThreadSafe командой BCL? Оказывается (с рефлектором), что основная логика для слушателя это:

private void internalWrite(string message) 
{ 
    if (Debugger.IsLogging()) 
    { 
     Debugger.Log(0, null, message); 
    } 
    else if (message == null) 
    { 
     SafeNativeMethods.OutputDebugString(string.Empty); 
    } 
    else 
    { 
     SafeNativeMethods.OutputDebugString(message); 
    } 
} 

ли доступ к методу Debugger.Log или OutputDebugString строка должна быть синхронизирована?

Ссылки:

ответ

1

В дополнение к письму в OutputDebugString, то DefaultTraceListener также записывает в лог-файл, если он указан. Он не делает блокировки для доступа к файлу, и поэтому он не помечен потокобезопасным. Он использует инфраструктуру трассировки для сериализации доступа к своим методам.

Мы можем указать имя-файла журнала следующим образом:

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
    <system.diagnostics> 
     <assert logfilename="tracelog.txt" /> 
    </system.diagnostics> 
</configuration> 
Смежные вопросы