当新的视图控制器推动时,在Monotouch中有效地停止NSTimer

时间:2012-03-27 20:24:42

标签: c# ios multithreading xamarin.ios nstimer

我正在使用Monotouch为iPad开发一个基于调查的应用程序,我正在尝试实现一个计时器,如果有人花太长时间回答(_survey.Timeout),将调查返回到第一个问题。

我在视图控制器中使用以下代码,这在第一次被触发时工作正常但它继续循环 - 所以问题是,如何在新视图控制器时停止线程并正确处理计时器被推动,以便在新视图中从0秒有效地重新启动。

/* ViewDidLoad */
if (_survey.CurrentQuestion != 1)
        {
            var thread = new Thread(StartTimer as ThreadStart);
            thread.Start();
        }    

/* ThreadStart */
void StartTimer()
{
        using (var pool = new NSAutoreleasePool())
        {
            NSTimer.CreateScheduledTimer(_survey.Timeout, delegate { 
                _survey.CurrentQuestion = 1;
                _survey.Responses.Clear();
                QuestionController qvc = new QuestionController(_survey);
                this.NavigationController.PushViewController(qvc, false);       
            });
            NSRunLoop.Current.Run();
        }
}

我知道这可能是一件非常简单的事情,但请把我从痛苦中解救出来!

1 个答案:

答案 0 :(得分:4)

CreateScheduledTimer返回NSTimer。在该对象上调用Invalidate

NSTimer timer;

void StartTimer()
{
    using (var pool = new NSAutoreleasePool())
    {
        timer = NSTimer.CreateScheduledTimer(_survey.Timeout, delegate { 
            _survey.CurrentQuestion = 1;
            _survey.Responses.Clear();
            QuestionController qvc = new QuestionController(_survey);
            this.NavigationController.PushViewController(qvc, false);       
        });
        NSRunLoop.Current.Run();
    }
}

void StopTimer ()
{
    timer.Invalidate ();
    timer.Dispose ();
    timer = null;
}