Does ParameterizedThreadStart provide that an instance of an object will not be garbage collected?

I played with the following code snippet:

class RunMeBaby
{
    public void Start()
    {
        while (true)
        {
            Console.WriteLine("I'm " + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(1000);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        RunMeBaby r = new RunMeBaby();
        Thread t = new Thread(r.Start);  // ParameterizedThreadStart delegate
        r = null;
        GC.Collect(GC.MaxGeneration);
        t.Start();

        r = new RunMeBaby();
        t = new Thread(() => r.Start()); // ThreadStart delegate
        t.Start();
        //Thread.Sleep(1000);
        r = null;
    }
}

While the first part of main runs smoothly, the second part fails, when I comment on the call to the method Thread.Sleep(), I get a null exception.

, , , , r null. " " r , . , , , , . - , , r , null, -.

, ParameterizedThreadStart , , , .

+3
2

, , .

:

new Thread(r.Start)

Start r, ..

new Thread(new ThreadStart(r.Start)) // identical to new Thread(r.Start)

, r , ( null) . :

new Thread(() => r.Start())

r, .. r , .. . , : r, ( , null).

:

new Thread(state => ((RunMeBaby)state).Start(), r);

current r , ; state , () r , .

! , . , r ParameterizedThreadStart ( ), , . , , new Thread(r.Start). , , - " " (() => r.Start()), , , GC, , .

+5

, . ,

Thread t = new Thread(r.Start)

, , , . , r null , Thread → ParameterizedDelegate → → RunMeBaby.

r = new RunMeBaby();
t = new Thread(() => r.Start());

r, r. null , NRE.

+2

All Articles