gpt4 book ai didi

c# - ViewModel 每秒更新一次?

转载 作者:太空狗 更新时间:2023-10-29 20:21:43 25 4
gpt4 key购买 nike

我正在编写一个应用程序,显示用户在类(class)中的剩余时间列表。我希望该列表每秒动态更新,以便用户拥有完整的概览。

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 接口(interface),然后在每个 View 模型上实际设置一个计时器。

不过这是我的顾虑。在每个 View 模型上添加一个计时器似乎非常臃肿,这真的是实现这一目标的最佳方式吗?第二个问题是,如果计时器永远不会停止,这不会导致内存泄漏,因为计时器永远不会停止并使 View 模型保持事件状态吗?如果是这种情况,我的 Viewmodel 还需要实现 IDisposable,并且我需要记住遍历所有 Viewmodel 并处理它们以确保它们被垃圾收集。我的担忧是否正确?


谢谢。

是的,我正在考虑使用计时器服务来防止有多个计时器,但是必须手动注销肯定会在某些时候引入内存泄漏。

所以弱事件的想法很棒。

我正在考虑这样做:

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

最佳答案

您可以拥有一个带有私有(private)计时器和公共(public)事件的计时器服务,它每秒通知所有 View 模型。

关于内存问题,您可以在导航页面时向计时器服务注册 View 模型 (OnNavigatedTo),并在 View 关闭时取消注册 (OnNavigatedFrom)。这样,当 View 模型超出范围时,它们将不会对计时器服务有任何引用,并且它们将被正确地垃圾收集。

关于c# - ViewModel 每秒更新一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7622048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com