Dispose或Kill DispatcherTimer对象以及访问DispatcherTimer对象

11
问题1: 您好,我想知道是否有一种方法可以丢弃或销毁DispatcherTimer对象并创建一个新的同名对象?
问题2: 如果将DispatcherTimer对象设置为公共的,我能否在其他类中访问它?
2个回答

22
  1. 你无法释放DispatcherTimer对象,因为它没有实现IDisposable接口。在托管的环境下,你不能显式地销毁(释放,摧毁)对象。 如果你不再需要计时器对象,请将其禁用并将引用设置为空。稍后GC会收集它。 你可以通过将IsEnabled = false或调用timer.Stop()来禁用或停止计时器。效果是一样的。
  2. 是的,我假设你有这样的公共属性:

    public DispatcherTimer MyTimer { get; private set; }


是的,停止计时器的方法很好用,但我很想知道是否可以以某种方式处理它....我已经找到了解决方法。 - ahmad05
2
IsEnable 无法设置。timer.stop 不会处理 tick 事件。即使将 DispatcherTimer 分配给新的 DispatcherTimer,我仍然会收到重复的 tick 事件。 - Syaiful Nizam Yahya
这个问题被标记为WPF。因此,在我的答案中,我提到了来自WindowsBase程序集的System.Windows.Threading.DispatcherTimer类,而不是来自Windows Runtime API的Windows.UI.Xaml.DispatcherTimer。 - Lubo
1
@SyaifulNizamYahya 这就是为什么我使用 myTimer1.Tick -= OnTimerTick_Move; myTimer1.Tick += new EventHandler(OnTimerTick_Move); 当计时器将被多次启动以便分离事件处理程序,或者你可以在调用 myTimer1.Stop(); 时这样做。 - vinsa
1
@vinsa从处理程序中解除绑定是明智的。但你的代码最后一次会解除绑定吗? - gusmally supports Monica

4

针对Lubo的正确回答,还有以下评论的主题:即使你不能销毁DispatcherTimer(很可能是因为它已经连接到WPF / UWP Dispatcher的非托管部分,并且与应用程序本身一样长),你仍应该取消订阅其事件。

比如说,如果你有一个方法(StartRefreshTimer),在其中初始化了你的DispatcherTimer并开始监听其Tick事件:

private DispatcherTimer _refreshTimer = new DispatcherTimer() { Interval = TimeSpan.FromMinutes(1) };

private void StartRefreshTimer()
{
    if (_refreshTimer != null)
    {
        _refreshTimer.Tick += OnTick; // subscribe to timer's ticks
        _refreshTimer.Start(); // start timer
    }
}

private void OnTick(object sender, object args)
{
    // your custom OnTick logic
}

接下来您应该有一个停止计时器并取消订阅其事件的方法:

private void StopRefreshTimer()
{
    if (_refreshTimer != null)
    {
        _refreshTimer.Stop(); // stop timer
        _refreshTimer.Tick -= OnTick; // unsubscribe from timer's ticks
    }
}

你需要确保在你的类被释放时调用这个“拆卸”方法(比如说,当你的 WPF / UWP 控件或 ViewModel 被卸载时)。如果你不取消计时器事件的订阅,可能会因为来自外部作用域到你的计时器托管类的引用而导致内存泄漏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接