DotNet项目在Debug 和Release 模式一个主要的差别就是有没有打开编译器优化
在release下由于采用了编辑器优化,那么原来有些运行正常的代码就会出问题
下面一段代码就是这样
internal static class StrangeBehavior
{
// As you'll see later, mark this field as volatile to fix the problem
private static Boolean s_stopWorker = false;
public static void Main()
{
Console.WriteLine("Main: letting worker run for 5 seconds");
Thread t = new Thread(Worker);
t.Start();
Thread.Sleep(5000);
s_stopWorker = true;
Console.WriteLine("Main: waiting for worker to stop");
t.Join();
}
private static void Worker(Object o)
{
Int32 x = 0;
while (!s_stopWorker) x++;
Console.WriteLine("Worker: stopped when x={0}", x);
}
}
在Debug模式编译运行 你会发现程序正常的结束了
在Release模式编译运行 你会发现程序进入了死循环 , 在while 那条语句
这是由于编译器在优化模式下会认为s_stopWorker是一个常量(非true即false)
当s_stopWorker为false的时候, 编译器认为永远是while(true) 就进入了死循环
但s_stopWorker为true的时候,编辑器会直接忽略掉 while(!s_stopWorker) ... 这句话