寻求一个尺寸适合所有基于上下文的存储

jsw*_*jsw 5 .net c# thread-static httpcontext

首先,我希望基于上下文的存储在整个框架中保持一致!

话虽如此,我正在寻找一种优雅的解决方案,使这些属性在ASP.NET,WCF和任何其他多线程.NET代码中都是安全的.这些属性位于一些低级跟踪帮助程序中(如果您想知道它们为什么是内部的,则通过方法公开).

我宁愿不依赖于不需要的程序集(如System.Web等).我不想要求使用此代码的任何人配置任何东西.我只是想让它起作用;)虽然这可能太高了一个订单......

任何人都有任何诡计?(我看过Spring的实现)

    internal static string CurrentInstance
    {
        get
        {
            return CallContext.LogicalGetData(currentInstanceSlotName) as string;
        }
        set
        {
            CallContext.LogicalSetData(currentInstanceSlotName, value);
        }
    }

    internal static Stack<ActivityState> AmbientActivityId
    {
        get
        {
            Stack<ActivityState> stack = CallContext.LogicalGetData(ambientActivityStateSlotName) as Stack<ActivityState>;
            if (stack == null)
            {
                stack = new Stack<ActivityState>();
                CallContext.LogicalSetData(ambientActivityStateSlotName, stack);
            }

            return stack;
        }
    }
Run Code Online (Sandbox Code Playgroud)

更新

安全我不是说同步.背景在这个问题上这里

cas*_*One 0

如果只是为了提供对属性的线程安全访问,我不知道使用 CallContext 是正确的选择。如果是这种情况,那么您只需要 lock 语句。

但是,您必须确保正确应用它。

使用 CallContext,您将获得线程安全的访问,因为当调用进入不同的线程(或不同的存储)时,您将拥有单独的 CallContext 实例。但是,这与对资源的线程安全访问有很大不同。

如果您想在多个线程之间共享相同的值,那么 lock 语句就是最佳选择。否则,如果您需要基于每个线程/调用的特定值,请使用 CallContext,或使用 Thread 类上的静态 GetData/SetData 方法,或 ThreadStatic 属性(或任意数量的基于线程的存储机制)。