【问题标题】:Conflict between Log4Net's ThreadContext and TaskLog4Net 的 ThreadContext 与 Task 冲突
【发布时间】:2023-03-12 02:02:01
【问题描述】:

有没有人尝试过同时堆叠上下文和使用任务?

我正在尝试这样的事情:

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());
}

我得到了这个结果:

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

我希望它在第二行有 [Saving Data] 而不是 [(null)]

它似乎在启动新任务后立即失去对 log4net ThreadContext Stack 的访问权限。

你知道如何避免这种情况吗?

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

【问题讨论】:

标签: c# .net multithreading task log4net


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多