Systems.Timers.Timer在调试中工作,但不是发布

时间:2016-05-16 18:54:39

标签: c# asp.net-mvc timer

return +(i>1)

事件在调试模式下始终触发,并且一直未在发布模式下触发。我尝试禁用编译器优化,但它没有帮助。

我试图在asp.net mvc应用程序.net 4.6框架

中运行它

3 个答案:

答案 0 :(得分:3)

你的计时器可能很好,但你的测试方法存在缺陷。

在ASP.NET应用程序中以发布模式写入Console.WriteLine的数据将丢失。请参阅此问题的答案:Where does Console.WriteLine go in ASP.net production environment?

如果您确实想使用Console.WriteLine,可以使用Console.SetOut将输出重定向到文件。

另外,请确保您的timer对象未在方法中声明,因为一旦方法完成,它将被销毁。

答案 1 :(得分:0)

您的计时器设置为1毫秒。这可能会产生一些不可预测的结果,因为“分辨率” - 检查定时器的间隔 - 通常约为15ms。如果你只是试图测试一个计时器的行为,那么我会把它增加到20ms或更长。

我测试了这个。运行500ms的1ms间隔持续经过32次 - 大约每15ms一次。这在调试和发布中是相同的。没有例外被抛出。

我不建议写入控制台,而是建议在计时器结束时将项目添加到全局可访问的ConcurrentQueue(因为这仅用于测试/实验。)

然后在网页上输出队列的内容。您可能希望先停止计时器,这样就不会将项目泵入队列。 (或者只是使用更长的间隔。)

答案 2 :(得分: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);
        }
    }

针对您的具体问题,验证计时器变量的范围是否为方法的本地范围。如果这是真的,你可以保持活着,如上所示。

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