2014-03-25 51 views
0

這次我來找你們尋求與定時器幫助(System.Timers是具體的,我相信)無法創建運行在C#中的功能的計時器

我需要運行一個計時器函數中的每條第二,到目前爲止,這是我已經有了:

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    Timer CooldownTracker; 

    protected override void LoadContent() 
    { 
     CooldownTracker = new Timer(); 
     CooldownTracker.Interval = 1000; 
     CooldownTracker.Start(); 
    } 

    private void DecreaseCooldown(List<Brick> bricks) 
    { 
     foreach (Brick brick in bricks) 
     { 
      if (brick.Cooldown == 0) 
       brick.Cooldown = 2; 
      else 
       brick.Cooldown--; 
     } 
    } 
} 

...我如何運行DecreasedCooldown(名單磚)功能的計時器?我用Timer.Elapsed嘗試過,但我什麼也沒有得到,我不能以這種方式傳遞參數。有任何想法嗎?

謝謝!

+0

您可能不應該在XNA中使用計時器。首選方法是使用'Update()'方法。基本上你有一個包含時間直到方法被觸發的類級字段/屬性,我們稱之爲'timeLeft'。每次調用Update()時,都會從'timeLeft'中減去已用時間(使用gameTime參數)。一旦'timeLeft' <= 0,調用方法觸發並重置'timeLeft'。 – itsme86

回答

2

您需要附上Timer Elapsed event,如:

CooldownTracker = new Timer(); 
CooldownTracker.Elapsed += CooldownTracker_Elapsed; //HERE 
CooldownTracker.Interval = 1000; 
CooldownTracker.Start();  

,並且隨後事件:

void CooldownTracker_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    DecreaseCooldown(yourList); 
} 
+0

我可以看到,但如何將列表發送到DecreaseCooldown函數,如果它在CooldownTracker_Elapsed內? – krieg

+1

@ krieg,像'DecreaseCooldown(yourList);',用你的變量的名稱替換'yourList'。 – Habib

+0

你可以嘗試使用System.Threading.Timer並作爲狀態傳入列表中。 –

0

,如果你願意,你可以使用線程。它不是很精確,也許是ThreadPool的原因,但可以提供幫助。 像

private bool run = true; 



Thread timer = new Thread(Run); 
timer.Start(); 

,並定義運行

private void Run() 
{ 
    while(run) 
    { 
     // Call function 
      Thread.Sleep(1000); //Time in millis 
    } 
} 

,如果你得到跨線程異常嘗試使用for循環,而不是的foreach或鎖定資源。