ViewModel每秒钟更新一次
本文关键字:一次 每秒钟 更新 ViewModel | 更新日期: 2023-09-27 18:10:08
我正在编写一个应用程序,显示用户在课程上的剩余时间列表。我希望列表每秒钟动态更新,以便用户有完整的概述。
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);
}
}
正如您在上面看到的那样,模型知道客户何时进入电路以及离开的时间。正如你所看到的,我正在考虑使用INotifyPropertyChanged接口,然后实际上在每个视图模型上都有一个计时器。
然而,这是我所关心的。在每个视图模型上添加计时器似乎非常臃肿,这真的是实现这一目标的最好方法吗?第二个问题是,如果计时器永远不会停止,这不会导致内存泄漏,因为计时器永远不会停止并保持视图模型存活?如果是这种情况,我的视图模型也需要实现IDisposable,我需要记住运行所有的视图模型并处理它们,以确保这些是垃圾收集。我的担忧是否正确?
谢谢。
是的,我想有一个定时器服务来防止有多个定时器,但是必须手动注销肯定会在某些时候引入内存泄漏。
所以弱事件的想法很好。
我想这样做:
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;
}
}
你有什么意见吗?我知道我可以使用单例GetInstance(或IoC),但这只会使它更不方便使用。
我使用Daniel Grunwald在codeproject上编写的WeakEvent实现。(它提供了一个非常干净的类,没有太多的开销)。http://www.codeproject.com/KB/cs/WeakEvents.aspx
你可以有一个带有私有计时器和公共事件的计时器服务,它每秒通知所有视图模型。
关于内存问题,您可以在页面导航(OnNavigatedTo
)时使用计时器服务注册视图模型,并在视图关闭(OnNavigatedFrom
)时注销它。这样,当视图模型超出作用域时,它们就不会与计时器服务有任何引用,并且它们将被正确地垃圾收集。