質問

C#を使用して、私はSystem.Timers.Timerオブジェクトから(経過イベントが発生する前に)残り時間を得ることができますか?

言い換えれば、私は6時間にタイマー間隔を設定するとしましょう、しかし、3時間後に、私は残っているどのくらいの時間を知りたいです。どのように私は、タイマーオブジェクトが残っている。この時間を明らかにすることになるだろう?

役に立ちましたか?

解決

内蔵のタイマーが経過するまでの残り時間を提供していません。あなたは、タイマーをラップし、この情報を公開する独自のクラスを作成する必要があります。

このような何か作業をする必要があります。

public class TimerPlus : IDisposable
{
    private readonly TimerCallback _realCallback;
    private readonly Timer _timer;
    private TimeSpan _period;
    private DateTime _next;

    public TimerPlus(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period)
    {
        _timer = new Timer(Callback, state, dueTime, period);
        _realCallback = callback;
        _period = period;
        _next = DateTime.Now.Add(dueTime);
    }

    private void Callback(object state)
    {
        _next = DateTime.Now.Add(_period);
        _realCallback(state);
    }

    public TimeSpan Period
    {
        get
        {
            return _period;
        }
    }

    public DateTime Next
    {
        get
        {
            return _next;
        }
    }

    public TimeSpan DueTime
    {
        get
        {
            return _next - DateTime.Now;
        }
    }

    public bool Change(TimeSpan dueTime, TimeSpan period)
    {
        _period = period;
        _next = DateTime.Now.Add(dueTime);
        return _timer.Change(dueTime, period);
    }

    public void Dispose()
    {
        _timer.Dispose();
    }
}

他のヒント

私は、トピックを超える3歳であることを、認識しています。しかし、私は正確に同じ問題に取り組む一方で、それに出くわしました。

サミュエル・ネフに触発され、私は標準でSystem.Timers.Timerクラスを拡張してWinFormsのレスソリューションを思い付います:

    public class TimerPlus : System.Timers.Timer
    {
        private DateTime m_dueTime;

        public TimerPlus() : base()
        {
            this.Elapsed += this.ElapsedAction;
        }

        protected new void Dispose()
        {
            this.Elapsed -= this.ElapsedAction;
            base.Dispose();
        }

        public double TimeLeft
        {
            get
            {
                return (this.m_dueTime - DateTime.Now).TotalMilliseconds;
            }
        }

        public new void Start()
        {
            this.m_dueTime = DateTime.Now.AddMilliseconds(this.Interval);
            base.Start();
        }

        private void ElapsedAction(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (this.AutoReset)
            {
                this.m_dueTime = DateTime.Now.AddMilliseconds(this.Interval);
            }
        }
    }

私はそれが役に立てば幸います。

私は最善の方法は、変数に開始時間を保持し、

のように経過時間を計算することであると思います
TimeSpan t = DateTime.Now - StartTime;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top