Log4Net的ThreadContext与Task之间的冲突

Íls*_*zan 5 .net c# log4net multithreading task

有没有人试图堆叠上下文并同时使用任务?

我正在尝试这样的事情:

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());
}
Run Code Online (Sandbox Code Playgroud)

我得到了那个结果:

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

我希望它 在第二行有[保存数据]而不是[(null)].

一旦启动新任务,它似乎就失去了对log4net ThreadContext Stack的访问权限.

你知道怎么避免这个吗?

编辑:起初o认为是交易范围的问题,但正如@stuartd指出的那样,它工作正常.然后我意识到有一个任务,这是真正的问题.

Tre*_*ley 4

该任务将在不同的线程上运行,因此堆栈中的数据ThreadContext不可用,您应该使用log4net.LogicalThreadContext代替 作为数据应该遵循逻辑执行并且仍然对任务可见Task