В чем разница между log4net.ThreadContext и log4net.LogicalThreadContext?

ОБНОВЛЕНО 18.11.2014 - Просматривая исходный репозиторий log4net, я обнаружил, что реализация LogicalThreadContext была изменена в ноябре 2011 года, так что она сохраняет свои свойства с помощью CallContext.LogicalSetData (и получает их с помощью LogicalGetData). Это важно, потому что это означает, что LogicalThreadContext теперь должен работать правильно. Любые данные, хранящиеся в LogicalThreadContext, должны передаваться любым дочерним потокам или задачам. Это сравнивается с ThreadContext (и старой реализацией LogicalThreadContext), где данные, хранящиеся в контексте, остаются локальными для текущего потока и НЕ передаются дочерним потокам / задачам.

Если вы заинтересованы, вот изменение:

http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs?r1=1165341&r2=1207948&diff_format=h

Надеюсь, кто-то, кто встречает этот старый вопрос, найдет эту информацию полезной

log4net предоставляет два разных объекта «контекста потока»:ThreadContext а такжеLogicalThreadContext, каждый из которых имеет свойство bag, Properties. ThreadContext имеетThreadContextProperties сумка, в то время как LogicalThreadContext имеетLogicalThreadContextProperties мешок.

ThreadContext, возможно, более широко известен как «MDC». LogicalContext, возможно, более широко известен как «LDC». Я буду использовать короткое имя для остальной части этого поста.

MDC.Properties реализуется с использованиемSystem.Threading.Thread.SetData в то время как LDC.Properties реализуется с использованиемSystem.Runtime.Remoting.Messaging.CallContext.SetData.

Для сравнения, NLog предоставляет только «MDC» (теперь известный как MappedDiagnosticContext) для хранения локальных свойств потока. Реализация NLog использует System.Threading.Thread.SetData, поэтому его реализация такая же, как и у log4net.

И в log4net, и в NLog свойства "MDC" хранятся в словаре, который сам хранится в локальном хранилище потока.

В случае, подобном этому, было бы эквивалентно сохранение словаря в переменной-переменном-члене класса, обработанной с помощью [ThreadStatic]?

[ThreadStatic]
private static IDictionary<string, string> threadProperties;

Каким должно быть эквивалентное (или подобное) объявление с использованием нового класса ThreadLocal в .NET 4.0?

В конечном счете, в чем заключается реальная практическая разница между НРС и МДС? Даже после прочтения вышеупомянутых тем MSDN мне это не понятно. Когда бы вы действительно использовали один поверх другого? Кажется, что подавляющее большинство ссылок / примеров, которые я вижу для log4net и context, относится к GDC (глобальный - который я понимаю), NDC (вложенный - который я также понимаю) и MDC. Большинство ссылок, которые я могу найти на LDC (или LogicalThreadContext) при поиске в Google, относятся к регистрации в репозиториях исходного кода log4net, а не к реальному использованию. НРС почти никогда не подходит к вопросам или примерам.

Я нашелэтот ссылка, которая предлагает довольно хорошую информацию о разнице с одним из разработчиков log4net, Нико Каделлом, но она все еще не ясна для меня.

Более большой вопрос, не связанный напрямую с log4net, заключается в том, в чем практическая разница между Thread.SetData и CallContext.SetData?

СогласноCallContext Статья MSDN, данные CallContext могут быть распространены на другой домен приложений. Для распространения элемент данных, хранящийся в CallContext, долженILogicalThreadAffinative интерфейс. Так что, похоже, это одно из различий между Thread.SetData и CallContext.

Согласно ссылке Nicko Cadell, log4net не реализует ILogicalThreadAffinative, поэтому свойства LDC распространяться не будут.

Может быть, здесь достаточно, чтобы я мог ответить на свой вопрос, а может и нет. Я все еще работаю над пониманием.

Если вы используете log4net, вы все используете MDC, LDC, оба? Если вы используете MDC, это потому, что большинство примеров из "реального мира", кажется, используют его? Если вы используете LDC, у вас есть конкретная причина для его использования? Если вы используете оба, как вы выбираете, когда использовать какой?

Обратите внимание, что я видел некоторые статьи, касающиеся MDC (и, возможно, LDC), возможно, не работает правильно в приложениях ASP.net из-за переключения потоков. Я не особенно заинтересован в этой проблеме, так как я не работаю в ASP.net.

На самом деле, я нашел пару полезных постов здесь, на SO, которые могут помочь в обсуждении:

Каковы лучшие практики для использования локального хранилища потоков в .NET?

.Net: логическая нить и нить локального хранилища?

Заранее спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос