2011-01-06 35 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這樣的事情上搞砸,如果你不需要的話。

相關問題