1

首先,感谢您抽出宝贵时间阅读这篇文章。

我有一个计时器类,它每 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) 控件的标记属性:

<Page.Resources>
    <!-- Products Timer -->
    <products_timer:GetProducts x:Key="getProducts_timer" />
</Page.Resources>


Tag="{Binding Source={StaticResource getProducts_timer}, Path=EnabledProducts, Mode=OneWay}"

这真的很好用。我遇到的问题是,当控件所在的窗口或页面关闭时,无论如何计时器都会继续计时。

一旦页面/控件不再可用,任何人都可以提出一种停止自动收报机的方法吗?

再次感谢您的宝贵时间。非常感谢所有帮助。

4

1 回答 1

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();
}
于 2012-12-19T12:02:57.320 回答