Как создать экземпляр Cce TraceSources для регистрации (многопоточного) веб-приложения ASP.NET 2.0 (asmx ws)? - PullRequest
1 голос
/ 14 декабря 2009

Ни в одном из примеров на TraceSource я не нашел адреса многопоточности. Я создаю новый экземпляр класса (SyncService) для обслуживания входящего запроса. Когда есть много активности, есть несколько потоков, которые должны использовать этот TraceSource для регистрации действий. Как мне использовать этот класс для регистрации с учетом производительности и безопасности потоков? Я имею в виду некоторые варианты:

    private static TraceSource _source;

    static SyncService()
    {
        _source = new TraceSource("mySrc");
    }

в случае выше безопасности потока является проблемой. Журналирования довольно много, поэтому я не хочу везде делать блокировки для защиты доступа к методу TraceEvent. Как насчет удаления обоих статических ключевых слов? Много ли накладных расходов, когда все запросы регистрируются из собственного TraceSource? Есть ли лучшее решение, чем эти 2? msdn заявляет: «Любые открытые статические (Shared в Visual Basic) члены этого типа являются поточно-ориентированными. Любые члены экземпляров не гарантируют поточно-ориентированные» Что я должен думать об этом?

1 Ответ

3 голосов
/ 14 декабря 2009

Определите TraceSource следующим образом, чтобы получить только один экземпляр:

private static readonly TraceSource _source = new TraceSource("mySrc");

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

TraceSource по умолчанию имеет глобальную блокировку в Trace.UseGlobalLock. Это автоматически заблокирует вас вокруг всех слушателей трассировки. Если установлено значение false, он будет блокироваться для TraceListener, если слушатель не определен как потокобезопасный.

Трассировка может быть узким местом, если скорость записи «медленная» и объем трассировки велик.

Чтобы обеспечить максимальную скорость, вам нужно использовать как можно меньше слушателей трассировки, убедиться, что они потокобезопасны, и установить Trace.UseGlobalLock = false. Если у вас нет контроля над добавлением слушателей в ваш app.config, вы должны сохранить глобальную блокировку.

...