[英]Why System.Timer doesn't change class member variable?
我有一個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
}
}
}
作為另一課,為什么在對SO提出問題時為什么應該始終發布真實代碼?
看來,解決您的問題的方法比其他答案建議的要簡單得多。 永遠不會引發計時器的Tick
事件,因此永遠不會更改enterHere
變量的值,因為您實際上從未啟動過計時器。 更具體地說,此行不正確:
Timer timer = new Timer(); //Timer Started
構造函數不啟動計時器。 您需要調用其Start
方法 。 這由文檔確認,該文檔顯示 :
創建新計時器后,它將被禁用; 即,
Enabled
設置為false。 要啟用計時器,請調用Start
方法或將Enabled
設置為true。
如果沒有必要,絕對沒有理由像Application.DoEvents
這樣。
我假設您正在使用System.Windows.Forms.Timer
在這種情況下, Tick
事件將在與function()
相同的線程上運行。 你可以放
Application.DoEvents();
在循環中獲取計時器計時。 或者,您可以使用另一個計時器(例如System.Threading
一個),該計時器在另一個線程上執行。
您還在WHILE(...)
循環中做什么,並且在代碼運行時檢查了處理器的使用情況嗎? 如果循環運行非常迅速,則您的應用將沒有時間處理其消息並響應計時器消息。
正如deltreme所說,插入Application.DoEvents();
在循環中應該給它一個處理消息的機會。
理想情況下,如果您有這樣的循環,則計時器應在其他線程中運行。 計時器將永遠無法引發事件。
或者,您可以調用DoEvents()來允許計時器完成工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.