Эффективная остановка NSTimer в Monotouch при нажатии на новый контроллер представления - PullRequest
1 голос
/ 28 марта 2012

Я разрабатываю приложение для iPad на основе опроса, используя Monotouch, и пытаюсь внедрить таймер, который возвращает опрос на первый вопрос, если кто-то слишком долго отвечает (_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 Ответ

4 голосов
/ 28 марта 2012

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;
}
...