Tôi viết một ứng dụng hiển thị danh sách thời gian còn lại mà người dùng có trong khóa học. Tôi muốn danh sách cập nhật động mỗi giây để người dùng có cái nhìn tổng quan đầy đủ.ViewModel cập nhật mỗi giây?
public class ReservationCustomerList : INotifyPropertyChanged
{
public int UnitsLeft { get; set; }
public DateTime? OnCircuitSince { get; set; }
public TimeSpan? TimeLeftDate
{
get
{
if (OnCircuitSince.HasValue)
return TimeSpan.FromSeconds((OnCircuitSince.Value - DateTime.Now).TotalSeconds - UnitsLeft);
return TimeSpan.FromSeconds(UnitsLeft);
}
}
private void FireEverySecond()
{
PropertyChanged.Fire(this, x => x.TimeLeftDate);
}
}
Như bạn có thể thấy ở trên ý tưởng là mô hình biết khi nào khách hàng bước vào mạch và thời gian còn lại. Như bạn có thể thấy iam suy nghĩ về việc sử dụng giao diện INotifyPropertyChanged và sau đó thực sự có một bộ đếm thời gian trên mỗi viewmodel.
Tuy nhiên, đây là mối quan tâm của tôi. Thêm một bộ đếm thời gian trên mỗi viewmodel có vẻ rất cồng kềnh, đây thực sự là cách tốt nhất để đạt được điều này? Mối quan tâm thứ hai là nếu bộ hẹn giờ không bao giờ dừng lại thì điều này sẽ không dẫn đến rò rỉ bộ nhớ vì bộ hẹn giờ sẽ không bao giờ dừng và giữ mô hình viewmodel không? Nếu đây là trường hợp ViewModel của tôi cũng sẽ cần phải thực hiện IDisposable và tôi sẽ cần phải nhớ để chạy qua tất cả các viewmodels và xử lý chúng để đảm bảo rằng đây là những thu gom rác thải. Mối quan tâm của tôi có đúng không?
Cảm ơn.
Có, tôi đã nghĩ đến việc có một dịch vụ hẹn giờ để ngăn việc có nhiều bộ hẹn giờ, tuy nhiên phải hủy đăng ký theo cách thủ công chắc chắn sẽ có một số điểm giới thiệu rò rỉ ghi nhớ.
Vì vậy, ý tưởng với Sự kiện yếu là điều tuyệt vời.
suy nghĩ Iam làm việc đó một cái gì đó như thế này:
public class TimerService
{
static Timer Timer;
static FastSmartWeakEvent<EventHandler> _secondEvent = new FastSmartWeakEvent<EventHandler>();
static FastSmartWeakEvent<EventHandler> _minuteEvent = new FastSmartWeakEvent<EventHandler>();
static DateTime LastTime;
public static event EventHandler SecondEvent
{
add { _secondEvent.Add(value); }
remove { _secondEvent.Remove(value); }
}
public static event EventHandler MinuteEvent
{
add { _minuteEvent.Add(value); }
remove { _minuteEvent.Remove(value); }
}
static TimerService()
{
Timer = new Timer(TimerFire, null, 1000, 1000);
}
static void TimerFire(object state)
{
_secondEvent.Raise(null, EventArgs.Empty);
if (LastTime.Minute != DateTime.Now.Minute)
_minuteEvent.Raise(null, EventArgs.Empty);
LastTime = DateTime.Now;
}
}
Bạn có bất cứ bình luận? Tôi biết tôi có thể sử dụng một GetInstance singleton (hoặc IoC) tuy nhiên điều này sẽ chỉ làm cho nó khó khăn hơn để sử dụng.
Iam bằng cách sử dụng triển khai WeakEvent mà Daniel Grunwald đã viết trên lập trình. (nó mang lại một lớp học rất sạch sẽ và không có nhiều chi phí). http://www.codeproject.com/KB/cs/WeakEvents.aspx
Giải pháp tốt. Nếu bạn đang sử dụng MEF hoặc tương tự, bạn có thể muốn giữ một thể hiện của dịch vụ trong vùng chứa thay vì sử dụng các phương thức tĩnh. Nếu không, sau đó tôi sẽ khuyên bạn nên làm cho nó một singleton. Có một thể hiện thay vì các phương thức tĩnh là tốt hơn để thử nghiệm. – alf