我有一个像这样的静态字段类
public class MyClass
{
public static Guid MyField1 { get; set; }
}
然后我就有了这样的方法。
public void MyMethod()
{
MyClass.MyField1 = Guid.NewID();
Task.Factory.StartNew( () => { MyAnotherMethod(MyClass.MyField1);}) ;
}
问题是,当我调用 MyAnotherMethod() 时,我得到一个异常,即“MyClass.MyField1”抛出了一个类型为“System.NullReferenceException”的异常。但是,如果我用下面的代码替换 Task.Factory.StartNew 调用,它就可以正常工作。
ThreadPool.QueueUserWorkItem(MyAnotherMethod, MyClass.MyField1);
有什么想法吗?
最佳答案
我认为这是一个线程/缓存问题。在线程 1 中,您将 11 分配给您的属性,但该值在缓存中,而线程 2 并不知道(例如,它正在查看 RAM)。为避免此问题,您可以使用锁,或指定 volatile keyword在你的变量上。
试试这个:
private static volatile int myField1;
public static int MyField1 { get { return myField1; } set { myField1 = value; } }
关于c# - 为什么这个对象为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8184734/