2016-05-16 66 views
0
System.Timers.Timer timer= new System.Timers.Timer(1); 
      timer.AutoReset = true; 
      timer.Elapsed += (s, e) => 
      { 
       Console.WriteLine("fired"); 
      }; 
timer.Start(); 

事件在调试模式下始终触发,并且始终未在发布模式下触发。我试过禁用编译器优化,但它没有帮助。Systems.Timers.Timer在调试中工作但不是版本

我想在一个asp.net MVC应用程序.NET 4.6框架

+1

难道'Console.WriteLine'未在发行模式下工作?我问,因为我在控制台有问题。WriteLine在一个配置中记录到VS输出窗口,但不在另一个配置中(从未想到为什么)。在你指责计时器之前,可能值得检查。 – adv12

+0

您确定代码块甚至运行以在释放模式下启动计时器吗?此外,你标记你的问题asp.net,也许你的应用程序域正在关闭? –

+0

我如何确定我的计时器正在运行?我知道它是用正确的时间间隔创建的。此外,我不确定这是否与asp相关,但我认为额外的信息不会受到伤害。它是有道理的,我的应用程序域正在关闭发布,但没有在调试? – blenddd

回答

3

你的计时器运行这可能是好的,但你的测试方法是有缺陷的。

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

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

此外,请确保您的timer对象没有在方法内声明,因为方法完成后它就会被销毁。

+0

我尝试了不同的东西,包括抛出异常......在发布版本中没有任何反应,并且调试仍然正常工作 – blenddd

+1

定时器的Elapsed事件运行在不同的线程中。没有什么可以捕捉到异常,所以线程会死掉,但不是整个应用程序。未处理的异常*可能会显示在Windows应用程序事件日志中。 –

+0

我在应用程序启动时会出现这种情况,所以应用程序应该抛出一个异常,这种异常确实发生在调试模式中,但不在发行版中。 – blenddd

0

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

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

而不是写入控制台,我建议将项目添加到一个全局可访问ConcurrentQueue当定时器结束的(因为这是只是为了测试/实验。)

然后一个网页,你可以输出的内容上的队列。您可能想要先停止计时器,以免它将物品放入队列中。 (或者只是使用更长的时间间隔。)

+0

现在试过了,没有帮助 – blenddd

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

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

替代的解决方案:正在计时器类级别静态变量

相关问题