2010-01-21 97 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可以实现这一点,它也有更高的分辨率。