我有一个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
}
}
}
答案 0 :(得分:3)
作为另一个经验教训,为什么在提问问题时应始终发布真正的代码...
您的问题的解决方案似乎比其他答案建议的要简单得多。计时器的Tick
事件永远不会被提升,因此价值enterHere
变量永远不会被更改,因为你实际上从未启动计时器。更具体地说,这一行不正确:
Timer timer = new Timer(); //Timer Started
构造函数不启动计时器;您需要拨打Start
method。 documentation确认这一点,其中说:
创建新计时器时,它被禁用;也就是说,
Enabled
设置为false。要启用计时器,请调用Start
方法或将Enabled
设置为true。
绝对没有理由不清楚Application.DoEvents
这样的事情,如果你不必这样做。
答案 1 :(得分:2)
我假设您使用的是System.Windows.Forms.Timer
,在这种情况下,Tick
事件将与您的function()
在同一个帖子上运行。你可以把
Application.DoEvents();
在你的循环中让计时器打勾。或者,您可以使用另一个计时器(例如System.Threading
),它在不同的线程上执行。
答案 2 :(得分:1)
您在WHILE(...)
循环中还做了什么,并在代码运行时检查了处理器使用情况?如果循环运行得非常快,那么您的应用就没有时间处理它的消息并对定时器消息作出反应。
正如deltreme所说,在循环中插入Application.DoEvents();
应该让它有机会处理消息。
答案 3 :(得分:0)
理想情况下,如果你有一个这样的循环,计时器应该在不同的线程中运行。计时器永远无法举起活动。
另外,你可以调用DoEvents()来让计时器完成它的工作