2013-08-06 3 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) увольняют, а иногда нет. Я не мог найти причин, почему так оно и было.

Это код, который я использовал для initilize таймера (другие части одинаковы):

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

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

Метод OnNewGameStarted является обработчиком события и он вызывается после цепочки методов из Fleck вебсервер, когда некоторые определенное сообщение приходит Это.

+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 - из интерфейса приложения нити
  • System.Threading.Timer - не всегда поточно !
+0

Спасибо. Думаю, мне нужно будет узнать больше о многопоточности, чтобы выяснить точные причины сбоя в System.Threading.Timer –

+1

Сообщение теперь мертвая ссылка. Благодаря зашифрованному «go-link» формату Microsoft, не знаю, как найти оригинальную статью :( – 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 создает новый таймер для каждой игры. MoreOver, игра может закончиться только один раз :). Периодическая сигнализация здесь не предназначена. – Imran

+0

«Раньше я использовал System.Threading.Timer вместо System.Timers.Timer, а иногда и событие таймера (метод GameEndedCallback), а иногда и нет. Я не мог найти причин, почему так оно и было». Обратный звонок не вызывается по вопросу – user2323308

+0

@ user2323308, иногда его вызывали, поэтому я думаю, что проблема заключается не в определении правильных интервалов и задержки –

Смежные вопросы