计时器仅在调试模式下工作
本文关键字:工作 模式 调试 计时器 | 更新日期: 2023-09-27 18:19:40
我有一个控制台应用程序,包含以下主程序:
static void Main(string[] args)
{
var timer = new System.Threading.Timer(
e =>
{
//some code here
},
null,
TimeSpan.Zero,
TimeSpan.FromMinutes(1));
var backupTimer = new System.Threading.Timer(
e =>
{
//some code here
},
null,
TimeSpan.Zero,
TimeSpan.FromHours(24));
Console.ReadLine();
}
问题是,在调试模式下,它可以很好地工作,并在正确的时间段内调用两个定时器中的方法,如果在控制台中输入一些东西,程序就会结束工作(console.ReadLine()就是这样),但当我在Release模式下运行程序时,两个定时器都只调用一次(第一次),然后程序就会等待,直到我输入一些东西。
如何解决这个问题,这样我就可以编译一个正常工作的独立程序?
正如@SriramSakthivel建议的那样,您必须保留对计时器的引用作为字段,否则垃圾收集器会吃掉您的计时器。所以这里有解决方案:
private static System.Threading.Timer timer;
private static System.Threading.Timer backupTimer;
static void Main(string[] args)
{
timer = new System.Threading.Timer(
e =>
{
//something
},
null,
TimeSpan.Zero,
TimeSpan.FromMinutes(1));
backupTimer = new System.Threading.Timer(
e =>
{
//something
},
null,
TimeSpan.Zero,
TimeSpan.FromHours(24));
Console.ReadLine();
}
希望以下解决方案能有所帮助!
问题:
以下代码通过显示当前时钟时间始终按预期工作。
class Program
{
static void TimerProcedure(object param)
{
Console.Clear();
Console.WriteLine(DateTime.Now.TimeOfDay);
GC.Collect();
}
static void Main(string[] args)
{
Console.Title = "Desktop Clock";
Console.SetWindowSize(20, 2);
Timer timer = new Timer(TimerProcedure, null,
TimeSpan.Zero, TimeSpan.FromSeconds(1));
Console.ReadLine();
}
}
然而,如果您在发布模式下运行相同的代码,它只会第一次显示当前时间,但之后不会更新。
解决方案
通过添加GC.KeepAlive(对象)进行简单的调整,也可以使其在Release模式下正常工作。请参阅下面的代码。
class Program
{
static void TimerProcedure(object param)
{
Console.Clear();
Console.WriteLine(DateTime.Now.TimeOfDay);
#region Hidden
GC.Collect();
#endregion
}
static void Main(string[] args)
{
Console.Title = "Desktop Clock";
Console.SetWindowSize(20, 2);
Timer timer = new Timer(TimerProcedure, null,
TimeSpan.Zero, TimeSpan.FromSeconds(1));
Console.ReadLine();
GC.KeepAlive(timer);
}
}
替代解决方案:使计时器成为类级静态变量