DefaultTraceListener и Потокобезопасность - PullRequest
1 голос
/ 01 марта 2012

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

Зачем команде BCL помечать DefaultTraceListener как не ThreadSafe?Кажется (из Reflector), что основная логика для слушателя такова:

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 Ответ

1 голос
/ 05 марта 2012

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

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

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
   <system.diagnostics>
      <assert logfilename="tracelog.txt" />
    </system.diagnostics>
</configuration>
...