计时器仅在调试模式下工作

本文关键字:工作 模式 调试 计时器 | 更新日期: 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);
        }
    }

替代解决方案:使计时器成为类级静态变量