Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用DispatchTimer将经过的时间精确到1毫秒_C#_Silverlight_Dispatchertimer - Fatal编程技术网

C# 使用DispatchTimer将经过的时间精确到1毫秒

C# 使用DispatchTimer将经过的时间精确到1毫秒,c#,silverlight,dispatchertimer,C#,Silverlight,Dispatchertimer,我试图使用调度计时器测量按键事件之间的运行时间(以毫秒为单位),但当声明调度计时器的间隔为1毫秒,然后建立滴答事件时,它不是每1毫秒触发一次,而是大约10-100毫秒(猜测)。如果这个滴答声事件没有按时触发,我如何准确地测量时间(以毫秒为单位)?我在silverlight中执行此操作,它似乎无法访问System.Timers。System.Threading.Timer似乎也会发生同样的情况 以下是代码的基本内容: public void StartTimer(object o, RoutedE

我试图使用调度计时器测量按键事件之间的运行时间(以毫秒为单位),但当声明调度计时器的间隔为1毫秒,然后建立滴答事件时,它不是每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;
}
有什么想法吗?

改为启动一个,每次按下一个键时,只需从上次经过的毫秒数(需要存储在变量中)中减去秒表当前经过的毫秒数即可

    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();
    }

Silverlight中的系统线程计时器仅精确到20毫秒左右。通常,如果需要更好的分辨率,您可能需要一个多媒体计时器,但无法在Silverlight中直接访问这些计时器。这就是说,经过一些重大的调整和权衡,我已经读到有可能获得精度为~3ms的Silverlight计时器。参见此处引用的文档:

请注意,我自己并没有测试所有这些备选方案,但它们值得研究


另一个选择是最近引入的类。不幸的是,这只是一个高分辨率计时器,取决于您运行的硬件。MS文档没有指定如何确定它是否真的是高分辨率的,因此您唯一的选择是检查IsHighResolution属性。

我会检查它。但首先,我需要将我的项目从silverlight 3升级到4。silverlight web项目似乎不支持它。只有手机或xbox应用程序。看来3ms是我能期望的最好的,直到我能找到替代品或找到这个秒表组件。