2010-01-21 90 views
2

我需要計算在Silverlight 3.0中從一個狀態到另一個狀態所經過的時間。計算持續時間無DateTime.UtcNow

這是最常見的事:

DateTime Start = DateTime.UtcNow; 
. 
. 
. 
DateTime End = DateTime.UtcNow; 
TimeSpan Duration = End - Start; 

,但是這並不能掩蓋的情況是:用戶更改計算機的時間。 有沒有辦法使用其他計時器獲得相同的效果?例如,一個計時器,用於計算從打開計算機(C#中的Easy,但在SL中被阻止)或其他任何不基於DateTime.Now或DateTime.UtcNow的計時器以來的時間。

吉拉德。

回答

0

你可以我們DispatcherTimer設定在所要求的分辨率的時間間隔: -

Private WithEvents timer as DispatchTimer = New DispatcherTimer() 
Private counter As Integer = 0 

Private Sub TimerClick(ByVal sender as System.Object, ByVal e As EventArgs) Handles timer.Tick 
    counter += 1 
End Sub 

Private Sub StartTiming() 
    counter = 0 
    timer,Interval = TimeSpan.FromSeconds(1) 
    timer.Start() 
End Sub 

Private Function EndTiming() as TimeSpan 
    timer.Stop() 
    Return TimeSpan.FromSeconds(counter) 
End Function 
+0

這是可能的,但由於分派器使用優先級隊列,因此不能保證所計算的持續時間將是準確的,並且隨着時間的推移會出現越來越大的滯後 – Gilad 2010-01-21 17:01:53

+0

@Gilad:我想這取決於您的解決方案是什麼?分鐘?秒?毫秒?也取決於是否可以跳過某個事件或者是否所有事件都排隊。你希望使間隔明顯小於你想要的分辨率。您也可以將此方法與比較日期結合起來,這種方法允許您檢測間隔和DateTime差異之間的顯着不匹配,從而表明系統時間已被修改。 – AnthonyWJones 2010-01-21 17:14:01

0

你可以嘗試使用保存DateTime.Now一個變量在每一個dispatchertimer檢測更改計算機的時間蜱。然後在下一個勾號上檢查當前時間是否等於保存的值+定時器運行的間隔。然後,如果不是,我想你可以彈出一些警告,說「沒有作弊」或任何其他,並放棄你的應用程序。這樣,您仍然可以使用計算時間跨度的「正確」方式,並且仍然可以防止用戶更改計算機時間。我想你必須考慮到前面提到的計時器中可能發生的滯後,並以某種方式調整它。除非計算機時間出現重大變化,否則不要彈出警報。

0

如果您不需要從時間服務器進行精確提取?

0

您需要檢索與絕對時間無關的時間戳。 System.Diagnostics.Stopwatch可以實現這一點,它也有更高的分辨率。