我目前正在尝试实现一个简约的ThreadLocal类。我知道这是在 DotNet 4 中实现的,但我处于无法升级的情况。
我的想法是使用一个非常简单的类,该类保存一个弱哈希表,并且仅存储基于当前线程的对象作为键。(我们有一个弱哈希表的自定义实现)
您认为这是一种可行的方法还是需要考虑任何线程问题?是否可以使用当前线程作为键、内存问题等?
public class SimpleThreadLocal<T>
{
private readonly WeakHashtable _threadToValue;
public SimpleThreadLocal()
{
_threadToValue = new WeakHashtable();
}
public void Set(T value)
{
lock (this)
{
_threadToValue[Thread.CurrentThread] = value;
}
}
public T Get()
{
lock (this)
{
return (T) _threadToValue[Thread.CurrentThread];
}
}
}
为什么不使用LogicalCallContext
?它不仅像TLS一样工作,而且实际上更智能,并将您的"TLS"插槽值保留在异步回调等中。请参阅逻辑调用上下文:跨线程、应用程序域和进程流动数据以及执行上下文与同步上下文。