2010-02-17 24 views
14

Sử dụng C#, làm cách nào để có thời gian còn lại (trước khi sự kiện trôi đi xảy ra) từ đối tượng System.Timers.Timer?System.Timers.Timer Cách lấy thời gian còn lại cho đến khi Elapse

Nói cách khác, giả sử tôi đặt khoảng thời gian hẹn giờ là 6 giờ, nhưng 3 giờ sau, tôi muốn biết còn bao nhiêu thời gian. Làm thế nào tôi sẽ nhận được đối tượng bộ đếm thời gian để tiết lộ thời gian này còn lại?

Trả lời

27

Bộ hẹn giờ tích hợp không cung cấp thời gian còn lại cho đến khi trôi qua. Bạn sẽ cần phải tạo lớp của riêng bạn, bao gồm một bộ hẹn giờ và hiển thị thông tin này.

Điều gì đó như thế này sẽ hoạt động.

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

Trên và ngoài cuộc gọi, nhưng đã kiểm tra bạn vì nỗ lực của bạn. Cám ơn. Bạn thật tốt bụng. Tôi đã có một phương pháp mà sẽ tính toán bao nhiêu thời gian nên được còn lại, nhưng muốn xác nhận nó với đầu ra từ các đối tượng bộ đếm thời gian thực tế chính nó. Để xấu nó không phải là vốn đã được cung cấp. –

+2

+1 Cảm ơn mã hữu ích này, Sam! – BillW

+3

Vâng, anh ấy cũng viết nhanh như vậy. Ấn tượng. –

11

Tôi đoán phương pháp tốt nhất là để giữ thời gian bắt đầu trong một biến và sau đó tính toán thời gian trôi qua như

TimeSpan t = DateTime.Now - StartTime; 
+1

Tôi đồng ý. Nhưng, phải kiểm tra Sam vì những nỗ lực của anh ta; anh ấy đã viết một lớp để giúp tôi. Siêu tử tế. Cảm ơn cả hai người. –

10

Tôi biết, đó là chủ đề lớn hơn 3 tuổi. Tuy nhiên tôi đã xem xét nó trong khi giải quyết chính xác cùng một vấn đề.

Lấy cảm hứng từ Samuel Neff, tôi đã đưa ra một giải pháp WinForms-less bằng cách mở rộng các lớp System.Timers.Timer tiêu chuẩn:

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

Tôi hy vọng nó giúp.

Các vấn đề liên quan