2015-08-26 5 views
5

Hat jemand versucht, Kontexte zu stapeln und Aufgaben gleichzeitig zu verwenden?Konflikt zwischen ThreadContext und Aufgabe von Log4Net

Ich versuche, etwas wie folgt aus:

using (log4net.ThreadContext.Stacks["contextLog"].Push("Saving Data")) 
{ 
    log.Info("Starting transaction"); 
    var taskList = new List<Task>(); 
    taskList.Add(Task.Factory.StartNew(() => 
    { 
     log.Info("Inside Transaction"); 
    })); 
    Task.WaitAll(taskList.ToArray()); 
} 

und ich bin immer dieses Ergebnis:

2015/42/26 13:42:10,841 INFO [Saving Data] Starting transaction 
2015/42/26 13:42:10,870 INFO [(null)] Inside Transaction 

ich es erwartet hatte zu haben [Speichern von Daten] statt [ (null)] in der zweiten Zeile.

Es scheint den Zugriff auf den log4net ThreadContext Stack zu verlieren, sobald eine neue Task gestartet wird.

Wissen Sie, wie Sie das vermeiden können?

EDIT: Zunächst dachte ich, es war ein Problem mit Transaction Scope, aber wie @stuartd zeigte mir, es war in Ordnung. Dann wurde mir klar, dass es eine Aufgabe gab und das war das eigentliche Problem.

+2

sichtbar sein kann reproduzieren Sie das nicht - https://gist.github.com/stuartd/81c8754391aa1a580da0 - können Sie dies mit mehr Code aktualisieren, damit es reproduzierbar ist? – stuartd

+0

@stuartd du hast Recht. Ich habe die Frage so geändert, dass sie das tatsächliche Problem widerspiegelt: System.Threading.Tasks. –

Antwort

4

Die Aufgabe in einem anderen Thread ausgeführt werden, so dass die Daten in dem ThreadContext Stapel nicht verfügbar sind, sollten Sie die Verwendung log4net.LogicalThreadContext stattdessen als Daten in dem sollten die logische Ausführung folgen und noch an die Task