ThreadStatic属性中的NullReferenceException

时间:2017-03-03 16:24:44

标签: c# .net multithreading

在以下代码中

public class ClassA
{
    [ThreadStatic]
    private static ClassB _b;
    protected static B
    {
        get { return _b; }
        set { _b = value; }
    }

    ...

    public void SomeMethod(Data data)
    {
        ...
        B.SomeVoidMethod(data);
        ...

        B = null;
    }
}

public class ClassB
{
    private ClassB() {}

    private ClassC _c;
    public C
    {
        get { return _c; }
    }

    public static ClassB MyMethod(Data data)
    {
        ClassB b = new ClassB();
        b._c = C.GetObject(data);

        return b 
    }
}

我在SomeMethod中得到NullReferenceException。我想其他线程调用此方法并使B null,但(如果我理解ThreadStatic)不应允许其他线程访问B.

我不能只使用:

get
{
    if (_b == null)
        _b = new B();
}

因为将B构造函数更改为public并以这种方式使用它会给我一个B实例,其中一些属性(例如C)为null。

我也尝试在SomeMethod中设置锁定 - 没有解决问题。

我想避免在classB中进行修改。没有它可以防止例外吗?

1 个答案:

答案 0 :(得分:1)

ThreadStatic意味着每个线程都有自己的字段版本。您正在获取NullReferenceExceptions,因为您没有初始化正在访问它的线程上的字段。

从文档的最顶层开始:“表示静态字段的值对于每个线程都是唯一的。”

https://msdn.microsoft.com/en-us/library/system.threadstaticattribute(v=vs.110).aspx