相关疑难解决方法(0)

.NET秒表类可以这么糟糕吗?

我正在制作一个需要一些相当紧凑的时间的应用程序,而秒表类是完美的解决方案.但是,有时候我注意到,当在小型平板电脑上运行时,秒表值已经过时了.我添加了一些调试打印输出,每200毫秒左右监视一次秒表的值:

0:00:197
0:00:502
0:00:702
...
0:03:356
0:12:93

0:13:21
0:13:421
...

它怎么可能从~3秒跳到~13秒?我现在看到底层函数QueryPerformanceCounter()是错误的(小心QueryPerformanceCounter()),但我感觉到其他东西在这里发生了.

任何见解都表示赞赏.

更新:

这里有关于我的代码的更多细节:它非常简单.它是一个WPF应用程序,它Stopwatch在启动时创建一个新对象,然后通过它启动它Start().我然后创建一个DispatcherTimer,像这样:

displayTimer = new DispatcherTimer(); 
displayTimer.Tick += display_Tick; 
displayTimer.Interval = DISPLAY_INTERVAL_TIMESPAN; 
Run Code Online (Sandbox Code Playgroud)

时间跨度为200毫秒.我的调试代码只是在Stopwatch每次dispatchTimer滴答时打印出对象的值.

UPDATE2:

一个有趣的Microsoft支持文章是性能计数器值可能意外地向前飞跃.

.net stopwatch

17
推荐指数
2
解决办法
7834
查看次数

C#等待Task.Delay(1000); 返回仅需640毫秒

所以,这很容易解释,但我已经搜索过,找不到任何有相同问题的人.我的问题起源于一项长期的周期性任务,这项任务比我想要的更频繁.似乎每个Task.Delay()我创建并等待返回约为我在ms中指定的延迟的65%.

问题归结为下面的代码行返回大约640-660毫秒(根据visual studio.我在这行代码上设置了一个断点,然后是跟随它的那个,它说已经过了多久):

await Task.Delay(1000); 
Run Code Online (Sandbox Code Playgroud)

在另外两台机器上,IDENTICAL代码库运行得很好.不仅是上面这个简单的陈述,还有周期性的任务.是否存在会影响Task.Delay(int millisecondsDelay)的设置?刻度类型,时钟速度,任何东西,系统时钟??? 我很茫然...

编辑:

在下面的代码片段中,EtMilliseconds是130-140ms,大约是相同的.上述预期持续时间的65%.从来没有任何东西(除了第一次进入while()是无关紧要的).

Long EtMilliseconds;
Stopwatch etWatch = new Stopwatch();
etWatch.Restart();

while (true)
{
  EtMilliseconds = etWatch.ElapsedMilliseconds;
  taskDelay = Task.Delay(200);
  etWatch.Restart();
  await taskDelay;
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

以下代码导致EtMilliseconds再次为131ms左右.使用Thread.Sleep似乎没有效果......

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        long EtMilliseconds;
        Stopwatch etWatch = new Stopwatch();
        etWatch.Restart();

        while (true)
        {
            EtMilliseconds = etWatch.ElapsedMilliseconds;
            label.Content = EtMilliseconds.ToString();
            etWatch.Restart();
            Thread.Sleep(200);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码段相同但使用Task.Delay(200).这个正确地更新了GUI标签(Thread.Sleep没有),它是131或140ms.总是...

public partial class MainWindow : …
Run Code Online (Sandbox Code Playgroud)

c# wpf

10
推荐指数
1
解决办法
597
查看次数

标签 统计

.net ×1

c# ×1

stopwatch ×1

wpf ×1