簡體   English   中英

為什么System.Timer不更改類成員變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM