【发布时间】:2012-11-07 10:32:47
【问题描述】:
问题 1: 嗨,我想知道有没有一种方法可以让我处理或杀死 DispatcherTimer 的对象并创建一个同名的新对象?
问题 2: 如果 DispatcherTimer 对象设置为 Public,我可以访问其他类中的对象吗?
【问题讨论】:
标签: c# wpf uwp dispatchertimer
问题 1: 嗨,我想知道有没有一种方法可以让我处理或杀死 DispatcherTimer 的对象并创建一个同名的新对象?
问题 2: 如果 DispatcherTimer 对象设置为 Public,我可以访问其他类中的对象吗?
【问题讨论】:
标签: c# wpf uwp dispatchertimer
timer.Stop() 来禁用或停止计时器。效果是一样的。是的。我想你有这样的公共财产:
public DispatcherTimer MyTimer { get; private set; }
【讨论】:
myTimer1.Tick -= OnTimerTick_Move; myTimer1.Tick += new EventHandler(OnTimerTick_Move); 来多次启动计时器以分离事件处理程序,或者你可以在调用myTimer1.Stop(); 时这样做
添加来自 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 control 或 ViewModel 被卸载时)。如果您不取消订阅计时器事件,您最终可能会因从外部范围引用计时器托管类而导致内存泄漏。
【讨论】: