public void Run(GimmickValue value, DateTime current)
        {
            if (lastTriggerReceivedAt == value.TimeStamp)
            {
                return;
            }
            lastTriggerReceivedAt = value.TimeStamp;

            var dueTime = value.TimeStamp.AddSeconds(delayTimeSeconds) - current;

            if (dueTime.TotalSeconds < -Constants.Gimmick.TriggerExpireSeconds)
            {
                return;
            }
            var expireAt = Time.realtimeSinceStartup + dueTime.TotalSeconds + Constants.Trigger.OwnershipExpireExpectedSeconds;

            void Action()
            {
                if (expireAt < Time.realtimeSinceStartup)
                {
                    return;
                }
                Invoke();
            }

            schedulerCancellation?.Dispose();
            schedulerCancellation = new Scheduler.Cancellation();
            Scheduler.Schedule(dueTime, Action, schedulerCancellation);
        }
        public void Run(GimmickValue value, DateTime current)
        {
            if (lastTriggerReceivedAt == value.TimeStamp)
            {
                return;
            }
            lastTriggerReceivedAt = value.TimeStamp;

            var dueTime = value.TimeStamp.AddSeconds(delayTimeSeconds) - current;

            if (dueTime.TotalSeconds < -Constants.Gimmick.TriggerExpireSeconds)
            {
                return;
            }

            schedulerCancellation?.Dispose();
            schedulerCancellation = new Scheduler.Cancellation();
            Scheduler.Schedule(dueTime, Invoke, schedulerCancellation);
        }