c# - 为什么这个对象为空?

标签 c# multithreading .net-4.0 task-parallel-library task

我有一个像这样的静态字段类

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/

相关文章:

c# - C# 是否支持可变数量的参数,如何支持?

c# - 从 XBRL schemaRef 解析 XML 模式

java - 使线程跳过从其他线程读取输入操作

C# 异常行号始终为零 (0)

c# - 反编译C# Exe,部分源代码可用

c# - 如何检查 var 的空值?

c# - 想从 mysql 表中添加一个带有 gridview(行)总和的数据,但它显示 - 在 vs05,c# 中使用未分配的局部变量 'a' 错误?

C# 将 excel 文本格式的数据添加到剪贴板

java - 进化模拟 - 用于计时器事件处理的持久线程

Python 的多个循环和线程问题