return +(i>1)
事件在调试模式下始终触发,并且一直未在发布模式下触发。我尝试禁用编译器优化,但它没有帮助。
我试图在asp.net mvc应用程序.net 4.6框架
中运行它答案 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);
}
}
针对您的具体问题,验证计时器变量的范围是否为方法的本地范围。如果这是真的,你可以保持活着,如上所示。
替代解决方案:正在使计时器成为一个类级静态变量