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)
更新
安全我不是说同步.背景在这个问题上这里
如果只是为了提供对属性的线程安全访问,我不知道使用 CallContext 是正确的选择。如果是这种情况,那么您只需要 lock 语句。
但是,您必须确保正确应用它。
使用 CallContext,您将获得线程安全的访问,因为当调用进入不同的线程(或不同的存储)时,您将拥有单独的 CallContext 实例。但是,这与对资源的线程安全访问有很大不同。
如果您想在多个线程之间共享相同的值,那么 lock 语句就是最佳选择。否则,如果您需要基于每个线程/调用的特定值,请使用 CallContext,或使用 Thread 类上的静态 GetData/SetData 方法,或 ThreadStatic 属性(或任意数量的基于线程的存储机制)。
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |