C# 环境数据从线程流向任何子线程

C# 环境数据从线程流向任何子线程,c#,multithreading,C#,Multithreading,我试图通过跟踪我们定义的某种环境上下文来增强我们的服务器平台。每个上下文都至少有一个ID,随着功能流的发展,我们平台的各个部分可能会使用它,也可能不会使用它。在上下文中,可以创建线程(或者异步调用,或者类似于在其他线程上执行的WF)。我希望这些子线程能够参与父线程的上下文,至少能够获取ContextID 我想象如下: using (Context ctx = Context.Create()) { Log.Print(Context.Current.ID); Task task

我试图通过跟踪我们定义的某种环境上下文来增强我们的服务器平台。每个上下文都至少有一个ID,随着功能流的发展,我们平台的各个部分可能会使用它,也可能不会使用它。在上下文中,可以创建线程(或者异步调用,或者类似于在其他线程上执行的WF)。我希望这些子线程能够参与父线程的上下文,至少能够获取ContextID

我想象如下:

using (Context ctx = Context.Create()) {
    Log.Print(Context.Current.ID);
    Task task = Task.Factory.StartNew( () => {
        Log.Print(Context.Current.ID);
        using (Context ctx2 = Context.Current.CreateChild()) {
            Log.Print(Context.Current.ID);
        }
        ...
    }
    ...
    task.Wait();
}
所以,打印应该是这样的:

“上下文ID1”

“上下文ID1”

“ContextID1:ContextID2”

其主要目的是帮助跨多个服务器跟踪日志消息,这比我们现在所拥有的要容易得多。程序和数据在许多(数百)台机器之间流动,从一台机器到另一台机器的跟踪太繁琐。使用环境相关器将非常有帮助,我现在唯一的问题是我不知道子线程如何自动找出父线程的上下文,更不用说访问它的TLS了。如果我能得到父线程thead的ManagedThreadID,我就能让整个事情按照我想要的方式进行


我意识到我可以在创建线程/任务时将上下文作为起始参数传入,但是我们的平台中有数百万行代码,我不能仅仅进行更改。因此,要将其烘焙到核心框架中并使其完全环境化,将解决问题,我可以控制它。

我曾经设计过这样一个系统,我必须用自定义包装器替换所有与线程启动相关的代码,这些包装器可以概括和抽象出您想要的上下文链接。不幸的是,我不知道有什么好的透明机制可以解决这个问题

您最可能面临的问题之一是在线程池上执行代码并要求它继承父上下文。这里您需要考虑重用线程池线程的事实。在线程池线程上执行的每项工作都必须优雅地处理上下文继承,而不会影响将来在同一线程上执行的任何不相关的代码