解決する必要があるのは、問題というよりも疑問だということから始めましょう。私は今解決策を持っており、私にとってはうまくいきます。しかし、なぜ最初に問題が発生したのだろうか。
これは私が今持っているコードで、期待どおりに動作します:
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 サーバーからの一連のメソッドの後に呼び出されます。