c# - System.Timers.Timer 和 System.Threading.Timer 的不同行为

标签 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 Web 服务器的方法链之后调用。

最佳答案

有一个post关于 3 种定时器类型及其用途。 主要有:

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

关于c# - System.Timers.Timer 和 System.Threading.Timer 的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18072831/

相关文章:

C# 读取 csv,计算一些东西,导出另一个 csv

c# - 重新启动具有不同输入的线程

ruby-on-rails - 如何在 Rails 中测试带有 'Thread.new' 的代码?

qt - 如何让QT文本每隔几毫秒出现一次(闪烁)

ios - 更新计时器 UI 的最佳方式是什么

javascript - 如何逐个记录多个时间值

c# - 如何在C#中获取动态对象的类型?

c# - .NET IpcChannel 不能可靠地正确清理?

c# - 秒表时间始终为零

java - 如何在Project Reactor中正确使用Schedulers.single()?