同样的代码,在编译成Debug版和Resease版的行为会有不同。
程序代码如下
static void Main()
...{
TimerCallback callback = delegate(object state)
...{
Console.WriteLine("Hei, world.");
};
TimerCallback callback2 = delegate(object state)
...{
Console.WriteLine("Hellow world.");
};
Timer timer = new Timer(callback, null, 1000, 1000);
Timer timer2 = new Timer(callback2, null, 1000, 1000);
Console.ReadLine();
}
这段代码的作用是每隔一秒在屏幕上输出两个字符串。由于Timer是局部变量,理论上是要在主函数结束后才释放的。Debug版的程序的行为确实是这样,屏幕上会不断输出两个字符串。可是Release版的程序,会提前释放两个timer对象,屏幕上只会输出一次两个字符串。
虽然Release版的程序为了优化才有这样的问题,不过由于两种编译模式所产生程序行为的差异,还是对程序调试造成了很多麻烦,也会买下在开发时埋下未知Bug的隐患。大家在编码时应注意同类问题。
注:如果在Console.ReadLine()语句后再加一句timer.Dispose()的话,那么timer对象就不会被释放。而且,这段程序里只有一个Timer类型的对象的话,那么Timer对象也不会被释放。
本文探讨了.NET程序在Debug和Release模式下,Timer对象的行为差异。在Debug模式下,Timer正常工作,持续输出字符串;而Release模式中,为了优化,Timer可能提前释放,导致预期行为改变。这种差异可能导致调试困扰和潜在的运行时问题。解决方案是在适当位置显式调用Dispose()避免意外释放。

被折叠的 条评论
为什么被折叠?



