Jam*_*ago 5 c# silverlight dispatchertimer
我正在尝试使用调度计时器测量按键事件之间的经过时间(以毫秒为单位),但是当声明调度计时器的间隔为1毫秒然后建立tick事件时,它不会每隔1毫秒触发一次,而是像10- 100毫秒(猜测).如果此刻度事件未按时触发,如何准确测量时间(以毫秒为单位)?我在Silverlight中这样做,似乎无法访问System.Timers.System.Threading.Timer似乎也发生了同样的情况.
以下是代码的基础知识:
public void StartTimer(object o, RoutedEventArgs sender)
{
System.Windows.Threading.DispatcherTimer myDispatcherTimer = new
System.Windows.Threading.DispatcherTimer();
myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1); // 1 Milliseconds
myDispatcherTimer.Tick += new EventHandler(Each_Tick);
myDispatcherTimer.Start();
}
// A variable to count with.
int i = 0;
public void Each_Tick(object o, EventArgs sender)
{
i++;
}
public void keypress(object s, EventArgs args)
{
label1.contents = i.ToString();
i = 0;
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
相反,启动一个秒表,只需在每次按下一个键时,从最后一个经过的毫秒(您需要存储在一个变量中)中减去秒表当前经过的毫秒数.
private Stopwatch _stopwatch;
private int _lastElapsedMs;
public void StartTimer(object o, RoutedEventArgs sender)
{
_lastElapsedMs = 0;
_stopwatch = Stopwatch.StartNew();
}
public void keypress(object s, EventArgs args)
{
int elapsedMs = (int)_stopwatch.ElapsedMilliseconds;
int currentElapsed = (elapsedMs - _lastElapsedMs);
_lastElapsedMs = elapsedMs;
label1.contents = currentElapsed.ToString();
}
Run Code Online (Sandbox Code Playgroud)
Silverlight 中的 System.Threading 计时器只能精确到 20 毫秒左右。通常,如果您需要更好的分辨率,您会需要多媒体计时器,但您无法直接在 Silverlight 中访问这些计时器。也就是说,通过一些重大的调整和权衡,我了解到可以获得具有约 3ms 毫秒精度的 Silverlight 计时器。请参阅此处引用的文档:
请注意,我自己尚未测试所有这些替代方案,但它们值得研究。
另一种选择是最近引入的System.Diagnostics.Stopwatch类。不幸的是,这有时只是一个高分辨率计时器,具体取决于您运行的硬件。MS 文档没有指定如何确定它是否真正高分辨率,因此您唯一的选择是检查 IsHighResolution 属性。
| 归档时间: |
|
| 查看次数: |
10081 次 |
| 最近记录: |