处置或终止Dispatcher计时器对象和访问调度程序计时器对象

时间:2012-11-19 13:33:33

标签: c# wpf dispatchertimer

问题1: 嗨,我想知道有没有办法可以处理或杀死调度程序计时器的对象 并创建一个同名的新对象?

Qurstion 2: 如果设置为Public

,我可以访问其他类中的调度程序计时器对象

2 个答案:

答案 0 :(得分:15)

  1. 您无法处置DispatcherTimer对象。它没有实现IDisposable接口。您无法在托管世界中显式杀死(释放,销毁)对象。 如果您不再需要计时器对象,请将其禁用并将其引用设置为null。它将在稍后由GC收集。 您可以通过设置IsEnabled = false或调用timer.Stop()来禁用或停止计时器。效果是一样的。
  2. 是。我想你有这样的公共财产:

    public DispatcherTimer MyTimer { get; private set; }

答案 1 :(得分:0)

添加来自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 control ViewModel 时,调用此“ tear down”方法) )。如果不取消订阅计时器事件,则可能会由于外部作用域对计时器托管类的引用而导致内存泄漏。