2011-01-06 81 views
2

我有一个while循环,在这个循环中,有一个if条件。 但是条件会被计时器改变。但是定时器从不改变全局变量。 我无法理解。 问题在哪里?为什么System.Timer不会更改类成员变量?

例子:

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

你想做什么? – Bobby 2011-01-06 12:34:41

回答

2

我假设你使用的是System.Windows.Forms.Timer在这种情况下Tick活动将在同一个线程作为function()上运行。你可以放

Application.DoEvents(); 

在你的循环内让计时器打勾。或者,您可以使用其他计时器(例如System.Threading之一),该计时器在不同的线程上执行。

+0

Thanks.What一个简单的答案:) – Murat 2011-01-06 12:34:31

1

你还在做什么WHILE(...)循环,并检查了你的代码运行时的处理器使用情况?如果循环运行得非常快,您的应用程序就没有时间处理它的消息并对计时器消息作出反应。

正如deltreme所说,在循环中插入Application.DoEvents();应该给它一个处理消息的机会。

0

理想情况下,计时器应该在不同的线程中运行,如果你有这样的循环。计时器将永远无法提升事件。

Alteratively你可以调用的DoEvents()允许计时器做的工作

3

正如在问为什么在做题时,你应该总是发表您的真正代码的另一个教训...

看来你的问题的解决方案比其他答案的建议要简单得多。定时器的Tick事件永远不会被提出,因此enterHere变量的值永远不会被改变,因为你从来没有真正的启动定时器。更具体地讲,这条线是不正确的:

Timer timer = new Timer(); //Timer Started 

构造不启动定时器;你需要调用它的Start method这是由documentation证实,它说:

当创建一个新的计时器,它被禁用;即Enabled设置为false。要启用定时器,请调用Start方法或将Enabled设置为true。

绝对没有理由在Application.DoEvents这样的事情上搞砸,如果你不需要的话。

相关问题