2017-02-15 62 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.!"); 
}); 

上面的代碼將只執行的最後一個時,它是間。我想這兩個SecondsTotalSeconds以及MilliSecondsTotalMilliseconds。當我嘗試平等使用它不起作用。它只在更大或更小時才起作用。

+0

每個平臺都有不同的定時器實現(在Android上,他們使用的是私人'Looper'),並具有調用回調** **後您1000毫秒的時間跨度已經結束,您'Elapsed'將永遠不會被* *保證以配合您的時間跨度間隔... – SushiHangover

+0

你不介意一個小樣本,或者如果你知道關於它的鏈接? – batmaci

+0

什麼樣的樣本? – SushiHangover

回答

0

TotalSecondsTotalMilliseconds都以秒的小數部分作爲雙精度返回,所以您的檢查將失敗。 您可以解析該值作爲一個int或使用本:

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

我會嘗試,但我認可它,也試過,如果(ts.TotalSeconds == 60.0)的是,不應該是雙? btw ts.Seconds是整數,爲什麼這個不起作用? – batmaci

+0

我試過你的代碼。如果我只使用平等,它是行不通的。不幸的是,它不是我的解決方案。感謝信息反正 – batmaci

+0

你不應該用平等,你不能肯定,如果計時器將匹配您的平等成員。如果你真的想使用equal運算符,例如'(int)ts.TotalSeconds == 45'。 – Zroq