我一直在玩下面这段代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然main的第一部分是顺利执行的,但是当我对Thread.Sleep()方法的调用发表评论时,第二部分失败,我得到一个null异常.
我的理解是lambda表达式被懒惰地评估,可能会发生新线程没有足够快地启动而主要线程设置r为null第一个.现在我将这个"第二部分"放在一个r具有局部范围的静态方法中,问题就消失了.但是我想知道在特定情况下线程调度程序是否隐藏了该问题,可能在具有不同工作负载的不同机器上它仍然可能发生.或者有一些关于lambda表达式的东西保证即使它r超出范围,只要它没有设置null,它仍然以某种方式被引用.
最后我想知道我是否应该考虑 …