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

时间:2013-08-06 06:07:49

标签: c# multithreading 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是事件处理程序,当有一些特定的消息传到它时,它会在Fleck webserver的方法链之后被调用。

2 个答案:

答案 0 :(得分:4)

关于3种计时器类型以及它们的作用,有一个post。 主要的是:

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

答案 1 :(得分: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);