2017-02-15 7 views
0

У меня есть счетчик в приложении Xamarin.Forms, и я пытаюсь выполнить речь сразу, когда она достигает точных секунд или миллисекунд, но никогда не выполняется.Xamarin.Forms.Device.StartTimer - не удается поймать точную секунду или миллисекунду

Вот пример кода:

Xamarin.Forms.Device.StartTimer(TimeSpan.FromMilliseconds(1000),() => 
{ 
    ts = sw.Elapsed; 
    lblTimer.Text = String.Format("{0:00}:{1:00}", ts.Minutes, ts.Seconds); 

    if (ts.Seconds == 45) 
     Plugin.TextToSpeech.CrossTextToSpeech.Current.Speak("45 seconds"); 

    if (ts.TotalSeconds == 60) 
     Plugin.TextToSpeech.CrossTextToSpeech.Current.Speak("120 seconds"); 

    if (ts.TotalSeconds > 60 && ts.TotalSeconds <61) 
     Plugin.TextToSpeech.CrossTextToSpeech.Current.Speak("1 minute.!"); 
}); 

Код выше будет выполнять только последний, когда он находится между ними. Я попробовал как Seconds, так и TotalSeconds, а также MilliSeconds и TotalMilliseconds. Когда я пытаюсь использовать равное, это не работает. Он работает только тогда, когда он больше или меньше.

+0

Каждая платформа имеет различные реализации таймера (на Android они используют частные 'Looper') и должен вызвать функцию обратного вызова ** после ** Ваш Разрыв в 1000 мс закончился, ваш 'Истекший' никогда не будет * гарантирован *, чтобы соответствовать вашему интервалу интервалов времени ... – SushiHangover

+0

не против небольшой выборки или если вы знаете ссылку на нее? – batmaci

+0

Образец чего? – SushiHangover

ответ

0

Оба TotalSeconds и TotalMilliseconds возвращаются как дробная часть секунды как двойная, поэтому ваш чек не сработает. Вы можете либо разобрать, что значение как межд или использовать это:

if(Math.Abs(ts.TotalSeconds - 60) <= 1) 
    ... 
+0

Я попробую это, но я узнал его и попытался также, если (ts.TotalSeconds == 60.0) это не должно быть двойным? btw ts.Seconds является целым числом, почему это не работает? – batmaci

+0

Я пробовал свой код. он не работает, если я использую только равные. К сожалению, это не решение для меня. спасибо за информацию в любом случае – batmaci

+0

Вы не должны использовать равенство, вы не можете быть уверены, что таймер будет соответствовать вашему члену равенства. Если вы действительно хотите использовать равный оператор, попробуйте '(int) ts.TotalSeconds == 45' например. – Zroq