我目前正在尝试实现一个简约的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];
}
}
}
答案 0 :(得分:1)
为什么不使用LogicalCallContext
?它不仅像TLS一样,它实际上更聪明,并且会在异步回调等中保留“TLS”槽值。请参阅Logical Call Context: Flowing Data across Threads, AppDomains, and Processes和ExecutionContext vs SynchronizationContext。