【问题标题】:Why do I get NullReferenceException in the following code, C#? [duplicate]为什么我在以下 C# 代码中得到 NullReferenceException? [复制]
【发布时间】:2014-06-11 20:20:22
【问题描述】:

我有以下测试程序,其中我使用 ThreadStatic 变量,当我尝试此代码时,我得到一个 NullReferenceException

using System;
using System.Threading;

namespace MiscTests
{
    public class Person
    {
        public string Name { get; set; }
    }

    class Program
    {
        [ThreadStatic]
        private static Person _person = new Person { Name = "Jumbo" };

        static void Main(string[] args)
        {
            Thread t1 = new Thread(TestThread);
            t1.Start();
            Thread t2 = new Thread(TestThread1);
            t2.Start();         
            Console.ReadLine();
        }

        private static void TestThread(object obj)
        {
            Console.WriteLine("before: " + _person.Name);
            _person.Name = "TestThread";
            Console.WriteLine("after: " + _person.Name);
        }

        private static void TestThread1(object obj)
        {
            Console.WriteLine("before: " + _person.Name);
            _person.Name = "TestThread1";
            Console.WriteLine("after: " + _person.Name);
        }       
    }
}

谁能解释一下?

【问题讨论】:

  • 你在哪一行得到了异常?
  • NullReferenceException 错误总是由同一件事引起:您试图取消引用包含 null 的对象变量。
  • @RobertHarvey:在这种情况下,原因更加微妙。
  • @SLaks:你的意思是他没有试图取消引用包含 null 的对象变量?
  • @RobertHarvey:他试图取消引用一个对象,该对象 (1) 在其声明中具有非 null 初始化程序并且 (2) 从未显式分配给。在正常情况下(即没有ThreadStatic),这种组合永远不会导致 NullReferenceException。

标签: c# nullreferenceexception thread-static


【解决方案1】:

[ThreadStatic] 变量的初始化器只会在初始化该类型的线程上运行一次。

所有其他线程都会看到null

【讨论】:

  • 您会认为使用[ThreadStatic] 的人已经知道这一点。
【解决方案2】:

如果我没记错的话,您已经将 _person 声明为 ThreadStatic,这意味着您运行的第二个线程将无法访问它,因此它将为空。

【讨论】:

    猜你喜欢
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2012-04-11
    • 1970-01-01
    • 2019-07-17
    • 2020-10-06
    相关资源
    最近更新 更多