System.Timers.Timer和System.Threading.Timer的行为不同

本文关键字:System Timer Threading Timers | 更新日期: 2023-09-27 18:26:37

让我首先说,这与其说是需要解决的问题,不如说是一个问题。我现在有了解决方案,一切对我来说都很好。但我想知道为什么第一次出现问题。

这是我现在拥有的代码,它像我预期的那样工作:

    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是事件处理程序,当某些特定消息到达Fleck Web服务器时,它会在方法链之后调用。

System.Timers.Timer和System.Threading.Timer的行为不同

有一篇关于3种定时器类型及其功能的文章。主要有:

  • System.Timers.Timer用于多线程工作
  • System.Windows.Forms.Timer-来自应用程序UI线程
  • System.Threading.Timer-并不总是线程安全的

Timeout.Infinite是回调调用之间的时间间隔,单位为毫秒。指定Timeout.Infinite可禁用周期性信号。请参阅MSDN:http://msdn.microsoft.com/en-us/library/2x96zfy7.aspxTimeout。Infinite是一个用于指定无限等待期的常量。尝试此操作以获得对回调的周期性调用

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