Was ist der Unterschied zwischen log4net.ThreadContext und log4net.LogicalThreadContext?

UPDATED on 11/18/2014 - Beim Durchsuchen des log4net-Quellrepository stellte ich fest, dass die Implementierung von LogicalThreadContext im November 2011 dahingehend geändert wurde, dass ihre Eigenschaften mithilfe von CallContext.LogicalSetData gespeichert werden (und mithilfe von LogicalGetData abgerufen werden). Dies ist wichtig, da dies bedeutet, dass LogicalThreadContext jetzt ordnungsgemäß funktionieren sollte. Alle in LogicalThreadContext gespeicherten Daten sollten an untergeordnete Threads oder Tasks "weitergeleitet" werden. Dies ist vergleichbar mit ThreadContext (und der alten Implementierung von LogicalThreadContext), bei der im Kontext gespeicherte Daten lokal im aktuellen Thread verbleiben und NICHT an untergeordnete Threads / Tasks weitergeleitet werden.

Wenn Sie interessiert sind, ist hier die Änderung:

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

Hoffentlich wird jemand, der sich mit dieser alten Frage befasst, diese Informationen nützlich finden.

log4net bietet zwei verschiedene "Thread-Kontext" -Objekte: ThreadContext und LogicalThreadContext, von denen jedes eine Eigenschaftentasche (Properties) hat. ThreadContext hat ein ThreadContextProperties bag während LogicalThreadContext ein @ h LogicalThreadContextProperties Tasche

ThreadContext wird möglicherweise häufiger als "MDC" bezeichnet. LogicalContext wird möglicherweise häufiger als "LDC" bezeichnet. Ich werde den Kurznamen für den Rest dieses Beitrags verwenden.

MDC.Properties wird implementiert mit System.Threading.Thread.SetData während LDC.Properties mit @ implementiert wi System.Runtime.Remoting.Messaging.CallContext.SetData.

Zum Vergleich macht NLog nur "MDC" (jetzt als MappedDiagnosticContext bezeichnet) verfügbar, um lokale Thread-Eigenschaften zu speichern. Die Implementierung von NLog verwendet System.Threading.Thread.SetData, sodass die Implementierung mit der von log4net identisch ist.

Sowohl in log4net als auch in NLog werden die "MDC" -Eigenschaften in einem Wörterbuch gespeichert, das selbst im lokalen Thread-Speicher gespeichert ist.

Wäre in einem solchen Fall das Speichern des Wörterbuchs in einer mit [ThreadStatic] gekennzeichneten Klassenmitgliedsvariablen äquivalent gewesen?

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

Was ist die äquivalente (oder ähnliche) Deklaration unter Verwendung der neuen ThreadLocal-Klasse von .NET 4.0?

Worin besteht der tatsächliche, praktische Unterschied zwischen LDC und MDC? Selbst nachdem ich die oben verlinkten MSDN-Themen gelesen habe, ist es mir nicht klar. Wann würden Sie wirklich eins übereinander verwenden? Es scheint, dass die überwiegende Mehrheit der Referenzen / Beispiele, die ich für log4net und context sehe, für GDC (global - was ich verstehe), NDC (verschachtelt - was ich auch verstehe) und MDC ist. Die meisten Verweise, die ich beim Googeln auf LDC (oder LogicalThreadContext) finde, beziehen sich auf das Einchecken in die log4net-Quellcode-Repositorys, nicht auf die Verwendung in der Praxis. LDC taucht fast nie in Fragen oder Beispielen auf.

Ich habe @ gefundDie Link, der einige ziemlich gute Informationen über den Unterschied zu einem der log4net-Entwickler, Nicko Cadell, bietet, aber mir ist immer noch nicht klar.

Eine größere Frage, die nicht direkt mit log4net zusammenhängt, ist der praktische Unterschied zwischen Thread.SetData und CallContext.SetData.

Laut dem CallContextei einem MSDN-Artikel können CallContext-Daten an eine andere AppDomain weitergegeben werden. Um weitergegeben zu werden, muss ein im CallContext gespeichertes Datenelement das @ verfügbar mache ILogicalThreadAffinative Schnittstelle. Das scheint also ein Unterschied zwischen Thread.SetData und CallContext zu sein.

Nach dem Nicko Cadell-Link implementiert log4net ILogicalThreadAffinative nicht, sodass die LDC-Eigenschaften nicht weitergegeben werden.

Vielleicht ist hier genug, dass ich meine eigene Frage beantworten kann, vielleicht auch nicht. Ich arbeite immer noch am Verständnis.

Wenn Sie log4net verwenden, verwenden Sie jeweils MDC und LDC? Wenn Sie MDC verwenden, liegt das daran, dass die meisten Beispiele aus der "realen Welt" es zu verwenden scheinen? Wenn Sie LDC verwenden, haben Sie einen bestimmten Grund für die Verwendung? Wie wählen Sie aus, wann Sie welche verwenden möchten, wenn Sie beide verwenden?

Beachten Sie, dass ich einige Artikel zu MDC (und möglicherweise LDC) gesehen habe, die möglicherweise in ASP.net-Anwendungen aufgrund von Thread-Wechseln nicht richtig funktionieren. Ich interessiere mich nicht besonders für dieses Problem, da ich nicht in ASP.net arbeite.

Eigentlich habe ich hier auf SO ein paar nützliche Beiträge gefunden, die zur Diskussion beitragen könnten:

Was sind bewährte Methoden für die Verwendung des lokalen Speichers für Threads in .NET?

.Net: Logischer Thread und Thread-lokaler Speicher?

Danke im Voraus

Antworten auf die Frage(2)

Ihre Antwort auf die Frage