Frage

Mit C #, wie kann ich die Zeit bekommen restlichen von einem System.Timers.Timer Objekt (vor dem Ablauf Ereignis eintreten wird)?

Mit anderen Worten, lassen Sie sagen, dass ich das Timer-Intervall bis 6 Stunden eingestellt, aber 3 Stunden später, ich möchte wissen, wie viel Zeit bleibt. Wie würde ich das Timer-Objekt erhalten verbleibenden dieses Mal zu offenbaren?

War es hilfreich?

Lösung

Die eingebaute Timer nicht die Zeit bis zum Ablauf verbleibenden liefern. Sie müssen Ihre eigene Klasse erstellen, die einen Timer wickelt und setzt diese Informationen.

So etwas sollte funktionieren.

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();
    }
}

Andere Tipps

Ich bin mir bewusst, dass das Thema mehr als 3 Jahre alt. Allerdings stieß ich auf sie während der Bewältigung genau das gleiche Problem.

Inspiriert von Samuel Neff, ich kam mit einer WinForms losen Lösung, indem Sie den Standard System.Timers.Timer Klasse erweitert:

    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);
            }
        }
    }

Ich hoffe, es hilft.

Ich denke, die beste Methode ist, um die Startzeit in einer Variablen zu halten und dann berechnen die verstrichene Zeit als

TimeSpan t = DateTime.Now - StartTime;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top