2011-10-01 4 views
7

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

+0

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

Trả lời

7

Bạn có thể có dịch vụ hẹn giờ với bộ hẹn giờ riêng và sự kiện công khai, thông báo cho mọi chế độ xem mỗi giây.

Về vấn đề bộ nhớ, bạn có thể đăng ký chế độ xem của mình bằng dịch vụ hẹn giờ khi trang của bạn được điều hướng (OnNavigatedTo) và hủy đăng ký khi xem được đóng (OnNavigatedFrom). Bằng cách này, các chế độ xem sẽ không có bất kỳ tham chiếu nào với dịch vụ hẹn giờ khi chúng hết phạm vi và chúng sẽ là rác được thu thập đúng cách.

+4

Để hỗ trợ mô hình này, hãy xem [bài viết MSDN về các mẫu sự kiện yếu] (http://msdn.microsoft.com/en-us/library/aa970850.aspx) –

+4

Bạn cũng có thể sử dụng EventAggregator từ khung Prism: http://msdn.microsoft.com/en-us/library/ff921122(v=pandp.20).aspx – Ucodia