C# 页面导航后计时器未启动

C# 页面导航后计时器未启动,c#,timer,windows-phone-8,C#,Timer,Windows Phone 8,我有一个类可以在一定时间内运行函数: namespace Test { public static class At { private static void ExecuteDelayedAction(object o) { (o as Action).Invoke(); } public static void Do(Action action, TimeSpan delay, int

我有一个类可以在一定时间内运行函数:

namespace Test
{
    public static class At
    {
        private static void ExecuteDelayedAction(object o)
        {
            (o as Action).Invoke();
        }

        public static void Do(Action action, TimeSpan delay, int interval = Timeout.Infinite)
        {
            new Timer(new TimerCallback(At.ExecuteDelayedAction), action, Convert.ToInt32(delay.TotalMilliseconds), interval);
        }
        public static void Do(Action action, DateTime dueTime, int interval = Timeout.Infinite)
        {
            if (dueTime >= DateTime.Now) Do(action, dueTime - DateTime.Now, interval);
        }
        public static void Do(Action action, int delay, int interval = Timeout.Infinite)
        {
            Do(action, TimeSpan.FromMilliseconds(delay), interval);
        }
    }
}
在我的应用程序中还有两个页面-
Login.xaml
MainPage.xaml
。出于测试目的,我在
MainPage
constructor中添加了以下代码:

public MainPage()
{
    InitializeComponent();
    At.Do(delegate { Debug.WriteLine("MainPage"); }, 5000);
}

我的问题如下:若应用程序首先打开
MainPage
,那个么定时器工作正常,委托被执行。然而,若应用程序首先打开
Login
,然后导航到
MainPage
,那个么计时器就会自动失效。为什么会发生这种情况以及如何修复它?

我怀疑您正在创建的计时器正在被垃圾收集(GC'ed),因为您没有在任何地方保存对它的引用,只是删除了对新创建的计时器的引用

由于在页面之间导航会导致创建大量内存,因此可能会触发GC

尝试通过保留对计时器对象的引用来修复它。我将创建一个
Do
类实例,您可以在其中隐藏一个私有计时器,并保留对它的引用。但是,如果您想保持当前的静态类设计,您可以只返回一个作为计时器的对象

    public static object Do(Action action, TimeSpan delay, int interval = Timeout.Infinite)
    {
        var t = new Timer(new TimerCallback(At.ExecuteDelayedAction), action, Convert.ToInt32(delay.TotalMilliseconds), interval);
        return t;
    }
然后,您需要在页面中存储对计时器的引用

public MainPage()
{
    InitializeComponent();
    this.doObject = At.Do(delegate { Debug.WriteLine("MainPage"); }, 5000);
}
当然,如果
MainPage
是GC'ed,那么您的计时器也将是GC'ed,但是您可以通过将计时器的范围更改为适合您要运行的操作的范围来解决这一问题