C# Dispose或kill Dispatchermer对象和访问Dispatchermer对象
问题1: 您好,我想知道是否有一种方法可以处置或杀死Dispatchermer的对象,并创建一个同名的新对象 问题2: 如果Dispatchermer对象设置为Public,我可以访问其他类中的Dispatchermer对象吗C# Dispose或kill Dispatchermer对象和访问Dispatchermer对象,c#,wpf,uwp,dispatchertimer,C#,Wpf,Uwp,Dispatchertimer,问题1: 您好,我想知道是否有一种方法可以处置或杀死Dispatchermer的对象,并创建一个同名的新对象 问题2: 如果Dispatchermer对象设置为Public,我可以访问其他类中的Dispatchermer对象吗 无法处置Dispatchermer对象。它没有实现IDisposable接口。您不能在托管世界中显式杀死(释放、销毁)对象。 如果不再需要计时器对象,请禁用它并将对它的引用设置为null。稍后将由GC收集。 通过设置IsEnabled=false或调用timer.stop
timer.stop()
,可以禁用或停止计时器。效果是一样的public dispatchermer MyTimer{get;private set;}
添加到Lubo的正确答案(并从下面的评论中提出此主题):即使您无法处理Dispatchermer(很可能是因为它连接到WPF/UWP Dispatcher本身的非托管部分,与应用程序本身一样长),您仍然应该取消订阅其事件 比方说,如果您有某个方法(StartRefreshTimer),在该方法中初始化了Dispatcher并开始侦听其Tick事件: 然后,您应该有一个停止计时器并取消订阅其事件的方法:
private void StopRefreshTimer()
{
if (_refreshTimer != null)
{
_refreshTimer.Stop(); // stop timer
_refreshTimer.Tick -= OnTick; // unsubscribe from timer's ticks
}
}
您应该确保在类超出范围时(例如,当您的WPF/UWP控件或ViewModel被卸载时)调用此“分解”方法。如果不取消订阅计时器事件,可能会导致内存泄漏,这是由外部作用域对计时器宿主类的引用引起的。是的,停止计时器工作正常,但我很想知道我是否可以如何处理它。。。。我一直在努力工作,这是无法设定的。timer.stop不处理勾号事件。即使将Dispatchermer分配给一个新的Dispatchermer,我仍然会收到重复的tick事件。该问题用WPF标记。这就是为什么我在回答中从WindowsBase程序集中引用System.Windows.Threading.Dispatchermer类,而不是从Windows运行时API引用Windows.UI.Xaml.Dispatchermer。@SyaifulNizamYahya这就是为什么我使用
myTimer1.Tick-=OnTimerTick\u Move;myTimer1.Tick+=新事件处理程序(OnTimerTick\u Move)
计时器将多次启动以取消连接事件处理程序,或者您可以在调用myTimer1.Stop()时执行此操作代码>@vinsa从处理程序中解列是智能的。你的代码会在最后一次解压吗?
private void StopRefreshTimer()
{
if (_refreshTimer != null)
{
_refreshTimer.Stop(); // stop timer
_refreshTimer.Tick -= OnTick; // unsubscribe from timer's ticks
}
}