سؤال

باستخدام 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 سنوات. ومع ذلك صادفت ذلك أثناء معالجة نفس المشكلة بالضبط.

مستوحاة من صموئيل نيف ، توصلت إلى حل أقل من winforms عن طريق توسيع نطاق System.Timers.Timer:

    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