【问题标题】:Dispose or kill DispatcherTimer object and Accessing DispatcherTimer object释放或杀死 DispatcherTimer 对象和访问 DispatcherTimer 对象
【发布时间】:2012-11-07 10:32:47
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf uwp dispatchertimer


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

      public DispatcherTimer MyTimer { get; private set; }

    【讨论】:

    • 是的,停止计时器工作正常,但我很想知道我是否可以将其处理掉……我已经解决了
    • IsEnable 无法设置。 timer.stop 不处理滴答事件。即使将 DispatcherTimer 分配给新的 DispatcherTimer,我仍然会收到重复的滴答事件。
    • 问题用 WPF 标记。这就是为什么我在回答中提到来自 WindowsBase 程序集的 System.Windows.Threading.DispatcherTimer 类而不是来自 Windows 运行时 API 的 Windows.UI.Xaml.DispatcherTimer。
    • @SyaifulNizamYahya 这就是为什么我使用myTimer1.Tick -= OnTimerTick_Move; myTimer1.Tick += new EventHandler(OnTimerTick_Move); 来多次启动计时器以分离事件处理程序,或者你可以在调用myTimer1.Stop(); 时这样做
    • @vinsa 从处理程序中断开连接是聪明的。你的代码会在最后一次断开连接吗?
    【解决方案2】:

    添加来自 Lubo 的正确答案(并从其下的 cmets 提出该主题):即使您无法处理 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 controlViewModel 被卸载时)。如果您不取消订阅计时器事件,您最终可能会因从外部范围引用计时器托管类而导致内存泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多