以下代码是一个常见的例子,用于展示调试版本和发布版本之间的区别:
如果您使用调试配置运行此代码,则计时器将每两秒输出当前时间。由于编译器人为地延长了
这一切都按照应有的方式工作。奇怪的是,当您将Console.ReadLine更改为Console.ReadKey时,两个配置都会每两秒运行一次计时器。
Console.ReadKey和Console.ReadLine之间有什么区别?我从文档中了解到,Console.ReadKey会阻塞发出ReadKey方法的线程。但是GC.Collect仍然会触发.. 为什么通过阻塞主线程来扩展
在使用.NET 3.5时,不会发生这种情况!
using System;
using System.Threading;
public static class Program
{
public static void Main()
{
Timer t = new Timer(TimerCallback, null, 0, 2000);
Console.ReadLine();
}
private static void TimerCallback(Object o)
{
Console.WriteLine("In TimerCallback: " + DateTime.Now);
GC.Collect();
}
}
如果您使用调试配置运行此代码,则计时器将每两秒输出当前时间。由于编译器人为地延长了
Timer t
变量的生命周期,因此GC.Collect
没有任何效果。在发布配置中,计时器将只执行一次。GC.Collect
将垃圾回收t
变量,这就是全部内容。这一切都按照应有的方式工作。奇怪的是,当您将Console.ReadLine更改为Console.ReadKey时,两个配置都会每两秒运行一次计时器。
Console.ReadKey和Console.ReadLine之间有什么区别?我从文档中了解到,Console.ReadKey会阻塞发出ReadKey方法的线程。但是GC.Collect仍然会触发.. 为什么通过阻塞主线程来扩展
Timer t
的生命周期?
更新在使用.NET 3.5时,不会发生这种情况!
InternalSyncObject
。 - Alex Wiese