你可以使用System.Threading.Thread.CurrentThread作为字典中的键

时间:2012-06-21 10:33:35

标签: c# thread-safety weak-references

我目前正在尝试实现一个简约的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];
        }
    }
}

1 个答案:

答案 0 :(得分:1)

为什么不使用LogicalCallContext?它不仅像TLS一样,它实际上更聪明,并且会在异步回调等中保留“TLS”槽值。请参阅Logical Call Context: Flowing Data across Threads, AppDomains, and ProcessesExecutionContext vs SynchronizationContext