2013-08-06 13 views
2

讓我從這個問題開始說這是一個問題,而不是一個需要解決的問題。我現在有解決方案,事情對我來說工作得很好。但我想知道爲什麼第一次出現問題。System.Timers.Timer和System.Threading.Timer的不同行爲

這是我現在所擁有的代碼,它就像我期望:

private void OnNewGameStarted(Game game) 
    { 
     _activeGames.Add(game); 

     TimeSpan delay = game.GetTimeLeft(); 
     var timer = new Timer(delay.TotalMilliseconds) {AutoReset = false}; 
     timer.Elapsed += (sender, args) => GameEndedCallback(game); 
     timer.Start(); 
    } 

    private void GameEndedCallback(Game game) 
    { 
     if (_statisticsManager.RegisterGame(game)) 
      _gamesRepository.Save(game); 

     _gameStatusSubscriber.GameStatusChanged(game); 
    } 

我曾經使用System.Threading.Timer而不是System.Timers.Timer有時計時器事件(GameEndedCallback法)解僱了,有時候沒有。我找不到任何理由爲什麼這樣。

這是我用,用來初始化計時器(其他部分是相同的)的代碼:

  TimeSpan delay = game.GetTimeLeft(); 
      new Timer(GameEndedCallback,game,(int)delay.TotalMilliseconds,Timeout.Infinite); 
     } 

     private void GameEndedCallback(object state) 
     { 
      var game = (Game) state; 

方法OnNewGameStarted是事件處理程序,並當一定的消息涉及到它的從斑點的網絡服務器的方法鏈之後稱爲它。

+0

也許是在黑暗中拍攝的,但是,難道你的線程池中的工作線程已經耗盡嗎? – OzrenTkalcecKrznaric

+0

可能重複的[System.Timers.Timer vs System.Threading.Timer](http://stackoverflow.com/questions/1416803/system-timers-timer-vs-system-threading-timer) –

回答

4

有一個post約3分定時器的類型和他們做什麼。 的主要事情是:

  • System.Timers.Timer是多線程工作
  • System.Windows.Forms.Timer - 從應用程序UI線程
  • System.Threading.Timer - 並不總是線程安全!
+0

謝謝。我想我需要了解更多關於多線程才能找出System.Threading.Timer失敗的確切原因 –

+1

現在Post是一個死鏈接。由於微軟的神祕的「去鏈接」格式,沒有線索如何找到原來的文章:( – jklemmack

0

Timeout.Infinite是回調調用之間的時間間隔,以毫秒爲單位。指定Timeout.Infinite禁用定期信號。請參閱MSDN:http://msdn.microsoft.com/en-us/library/2x96zfy7.aspx Timeout.Infinite是一個用於指定無限等待期的常量。 試試這個讓perodic調用回調

new System.Threading.Timer(GameEndedCallback, game, (int)delay.TotalMilliseconds, (int)delay.TotalMilliseconds); 
+0

OP正在創建一個新的每個遊戲的計時器實例。更多,遊戲只能結束一次:)。定期信號不在此處。 – Imran

+0

「我曾經使用過System.Threading.Timer而不是System.Timers.Timer,有時會使用定時器事件(GameEndedCallback方法),有時候不會,我找不到任何理由爲什麼會這樣。」回叫不是按照每個問題調用 – user2323308

+0

@ user2323308有時它被調用,所以我猜這個問題不在於定義正確的時間間隔和延遲 –

相關問題