【问题标题】:Why System.Timer doesn't change class member variable?为什么 System.Timer 不更改类成员变量?
【发布时间】:2011-01-06 21:58:29
【问题描述】:
我有一个while循环,在这个循环中,有一个if条件。
但是条件会被计时器改变。但是计时器永远不会改变全局变量。
我无法理解。
问题出在哪里?
例子:
bool enterHere = false;
Timer timer = new Timer(); //Timer Started
private void timer_Tick(object Sender, ...)
{
enterHere = true;
}
private void function()
{
while(...)
{
if(enterHere)
{
//Never enter here
}
}
}
【问题讨论】:
标签:
c#
winforms
timer
global-variables
【解决方案1】:
作为另一个教训,为什么你应该总是发布你的真实代码,当你问关于 SO...的问题时......
看来您的问题的解决方案比其他答案建议的要简单得多。计时器的 Tick 事件永远不会被引发,因此 enterHere 变量的值永远不会改变,因为你从来没有真正启动计时器。更具体地说,这行是不正确的:
Timer timer = new Timer(); //Timer Started
构造函数不启动定时器;你需要打电话给它的Start method。这是由documentation确认的,上面写着:
当一个新的定时器被创建时,它被禁用;也就是说,Enabled 设置为 false。要启用计时器,请调用Start 方法或将Enabled 设置为true。
如果没有必要,绝对没有理由对 Application.DoEvents 之类的事情感到厌烦。
【解决方案2】:
我假设您使用的是System.Windows.Forms.Timer,在这种情况下,Tick 事件将与您的function() 在同一线程上运行。你可以放
Application.DoEvents();
在你的循环中让计时器计时。或者,您可以使用其他计时器(例如 System.Threading 计时器),它在不同的线程上执行。
【解决方案3】:
您在WHILE(...) 循环中还做了什么,并且您在代码运行时检查了处理器使用情况吗?如果循环运行得非常快,则您的应用没有时间处理它的消息并对计时器消息做出反应。
正如 deltreme 所说,在循环中插入 Application.DoEvents(); 应该让它有机会处理消息。
【解决方案4】:
如果你有这样的循环,理想情况下计时器应该在不同的线程中运行。计时器将永远无法引发事件。
您也可以调用 DoEvents() 来让计时器完成它的工作