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

时间:2014-08-28 10:39:12

标签: c# debugging timer release

我有一个控制台应用程序,其中包含以下主程序:

    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()用于此),但是当我运行程序时在发布模式下,两个计时器只调用一次(第一次),然后程序只等到我输入内容。

如何解决问题,所以我可以编译一个独立的程序正常工作?

2 个答案:

答案 0 :(得分:3)

由于@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();

    }

答案 1 :(得分:0)

希望以下解决方案有所帮助!

<强>问题:

通过显示当前时钟时间,以下代码始终按预期工作。

 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(对象)进行的简单调整将使其在发布模式下也能按预期工作。请参阅下面的代码。

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);
        }
    }

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