http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs?r1=1165341&r2=1207948&diff_format=h
希望有人会发现这个老问题有用。
log4net提供了两个不同的“线程上下文”对象:
ThreadContext
LogicalThreadContext
ThreadContextProperties
当LogicalThreadContext具有
LogicalThreadContextProperties
包。
LogicalContext可能更常见地被称为“LDC”。
我将在这篇文章的其余部分使用这个简称。
MDC属性使用
System.Threading.Thread.SetData
同时LDC属性使用
System.Runtime.Remoting.Messaging.CallContext.SetData
.
在log4net和NLog中,“MDC”属性存储在字典中,字典本身存储在线程本地存储中。
在这种情况下,将字典存储在用[ThreadStatic]修饰的类成员变量中是否等效?
[ThreadStatic]
private static IDictionary<string, string> threadProperties;
使用类似的本地thread(4.0)声明还是类似的.NET声明?
归根结底,最不发达国家和最不发达国家之间真正的、实际的区别是什么?即使在阅读了上面链接的MSDN主题之后,我也不清楚。你什么时候真的会用一个来代替另一个?我看到的log4net和context的绝大多数引用/示例都是针对GDC(global-我理解)、NDC(nested-我也理解)和MDC的。在google搜索时,我能找到的LDC(或LogicalThreadContext)的大多数引用都与签入log4net源代码存储库有关,而不是实际使用情况。最不发达国家几乎从不提出问题或例子。
我确实找到了
this
link提供了一些与log4net开发人员Nicko Cadell的区别的很好的信息,但是我还是不清楚。
与log4net没有直接关系的一个更大的问题是,两者之间的实际区别是什么线程集数据以及CallContext.SetData?
根据
CallContext
MSDN项目,CallContext数据可以传播到另一个AppDomain。要传播,存储在CallContext中的数据项必须公开
ILogicalThreadAffinative
接口。所以,这似乎是线程集数据和CallContext。
根据Nicko-Cadell链接,log4net没有实现ilogicthreadaffinative,因此LDC属性不会被传播。
也许这里有足够的东西可以让我回答我自己的问题,也许不行。我还在努力理解。
如果您使用log4net,您是否都使用MDC和LDC?如果你使用MDC,是不是因为大多数“真实世界”的例子都使用它?如果你使用LDC,你有没有使用它的具体原因?如果你同时使用两者,你如何选择何时使用哪个?
请注意,我看过一些关于MDC(可能还有LDC)的文章,可能在ASP.net线程切换导致的应用程序。我对这个问题不是特别感兴趣,因为我不是在工作ASP.net.
实际上,我在这里找到了一些有用的帖子,以便对讨论有所帮助:
What are best practices for using thread local storage in .NET?
.Net: Logical thread and Thread Local Storage?