什么';s log4net.ThreadLogicalContext和log4net.ThreadContext之间的区别

什么';s log4net.ThreadLogicalContext和log4net.ThreadContext之间的区别,log4net,Log4net,我不明白官方文件中的解释: 逻辑线程可以从一个托管线程跳到另一个托管线程 ThreadContext和ThreadLogicalContext之间有什么不同? 有人能详细说明一下吗 谢谢。我应该回去把这个添加到我自己的问题中(Stefan Egli在上面链接的问题) 据我所知,两者在实际上几乎没有什么区别 ThreadContext将信息存储在使用Thread.SetData存储的字典中 ThreadLogicalContext将其信息存储在使用CallContext存储的字典中 CallCon

我不明白官方文件中的解释:

逻辑线程可以从一个托管线程跳到另一个托管线程

ThreadContext和ThreadLogicalContext之间有什么不同? 有人能详细说明一下吗


谢谢。

我应该回去把这个添加到我自己的问题中(Stefan Egli在上面链接的问题)

据我所知,两者在实际上几乎没有什么区别

ThreadContext将信息存储在使用Thread.SetData存储的字典中

ThreadLogicalContext将其信息存储在使用CallContext存储的字典中

CallContext中存储的信息具有几乎相同的特性 可访问性作为使用Thread.SetData存储的信息。也就是说,首先存储信息的线程可以访问该信息

现在,如果ThreadLogicalContext使用CallContext.LogicalSetData(或者如果使用CallContext.SetData存储的字典实现了标记接口,IThreadAffinative),那么会有很大的区别。在这种情况下,存储的任何信息(LogicalSetData)都可以在同一线程中访问,并传递给子线程。此外(与逻辑线程一起流动) 信息可以在远程处理调用和AppDomains之间流动(如果数据可序列化)

我本来会加入一些链接,但我在iPhone上工作,所以有点尴尬。Stefan Egli在上面发布的链接中有一些不错的链接

另外,请查看Jeffrey Richter 9月份的博客中关于CallContext.LogicalSetData的文章。我使用他的测试程序作为比较CallContext.SetData与CallContext.LogicalSetData与Thread.SetData与[ThreadStatic]的基础。我上次检查是最后一次 他贴的东西

当我可以轻松访问计算机时,我将尝试回来发布更多链接和/或一些示例代码


祝你好运

通过我自己使用它,我看到了在处理多线程逻辑(
async
wait
)时使用ThreadLogicalContext的好处

例如,如果使用
ThreadContext
在原始调用线程上设置属性,则该属性也可用于在同一线程上运行的任何其他任务

// caller thread (thread #1)
log4net.ThreadContext.Properties["MyProp"] = "123"; // now set on thread #1
log("start");
await Task.WhenAll(
  MyAsync(1), // `Issue` if task run on thread #1, it will have "MyProp"
  MyAsync(2)  // `Issue` if task run on thread #1, it will have "MyProp"
);
log("end"); // `Issue` only by random chance will you run on thread #1 again
其中,如果您使用
ThreadLogicalContext
,它将保留在调用上下文中

// caller thread (thread #1)
log4net.LogicalThreadContext.Properties["MyProp"] = "123"; // now set on calling context
log("start");
await Task.WhenAll(
    MyAsync(1), // if task run on thread #1, there is no "MyProp"
    MyAsync(2)  // if task run on thread #1, there is no "MyProp"
);
log("end"); // if task run on thread #1, there is no "MyProp"
使用
wait
永远不能保证返回到与启动时相同的线程,并且调用上下文将发生更改,因此必须重新设置属性

...
log4net.LogicalThreadContext.Properties["MyProp"] = "123";
log("end");

还可以看到这个问题,它甚至不必是多线程的。例如,对于.NET web应用程序,框架会在必要时进行线程切换,这基本上会使ThreadContext变得无用,因为只有当整个请求在同一线程上运行时,框架才会工作,这是可能的,但不能保证。因此,当请求切换线程时,您会丢失与它所运行的线程绑定的任何上下文。。。将内容粘贴到LogicalThreadContext中,这样当您的许多异步调用进一步进入时,这些值就可以使用log4net注销(否则您将不得不将它们作为参数传递给调用,这会很混乱)