9

问题1:您好,我想知道有没有一种方法可以处理或杀死DispatcherTimer的对象并创建一个同名的新对象?

问题 2:如果DispatcherTimer对象设置为 Public,我可以访问其他类中的对象吗?

4

2 回答 2

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

    public DispatcherTimer MyTimer { get; private set; }

于 2012-11-19T14:43:05.083 回答
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被卸载时),你应该确保调用这个“tear down”方法。如果您不取消订阅计时器事件,您最终可能会因从外部范围引用到您的计时器托管类而导致内存泄漏。

于 2020-06-01T08:48:15.603 回答