2

解決する必要があるのは、問題というよりも疑問だということから始めましょう。私は今解決策を持っており、私にとってはうまくいきます。しかし、なぜ最初に問題が発生したのだろうか。

これは私が今持っているコードで、期待どおりに動作します:

    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.Timers.Timer の代わりに System.Threading.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 サーバーからの一連のメソッドの後に呼び出されます。

4

2 に答える 2