首先,感谢您抽出时间阅读这篇文章。
我有一个计时器类,每60秒从我的SQL数据库下载一次“产品”。即检查可能已由其他用户编辑的更新产品。
这是我的班级代码:
public class GetProducts : INotifyPropertyChanged
{
public GetProducts()
{
Timer updateProducts = new Timer();
updateProducts.Interval = 60000; // 60 second updates
updateProducts.Elapsed += timer_Elapsed;
updateProducts.Start();
}
public ObservableCollection<Products> EnabledProducts
{
get
{
return ProductsDB.GetEnabledProducts();
}
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("EnabledProducts"));
}
public event PropertyChangedEventHandler PropertyChanged;
}
然后我将其绑定到我的XAML(WPF)控件的tag属性:
<Page.Resources>
<!-- Products Timer -->
<products_timer:GetProducts x:Key="getProducts_timer" />
</Page.Resources>
Tag="{Binding Source={StaticResource getProducts_timer}, Path=EnabledProducts, Mode=OneWay}"
这非常有效。我遇到的问题是,当托管控件的窗口或页面关闭时,无论如何,计时器都会继续打开。
一旦Page / Control不再可用,有人可以建议一种方法来停止自动收报机吗?
再次感谢您的时间。非常感谢所有帮助。
答案 0 :(得分:6)
首先保持对计时器的引用:
private Timer updateProducts;
public GetProducts()
{
updateProducts = new Timer();
......
}
例如,创建另一个方法StopUpdates
,在调用时将停止计时器:
public void StopUpdates()
{
updateProducts.Stop();
}
现在在窗口的OnUnloaded事件中停止计时器:
private void MyPage_OnUnloaded(object sender, RoutedEventArgs e)
{
var timer = this.Resources["getProducts_timer"] as GetProducts;
if (timer != null)
timer.StopUpdates();
}