gpt4 book ai didi

c# - System.Threading 回调似乎不太准确

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:23 25 4
gpt4 key购买 nike

我的应用程序收到来自客户的指令。

在每条指令上,我想从收到的时间戳 + 10 秒开始执行代码。

为了测试我的代码的准确性,我模拟了这个简单的控制台测试:

    static DateTime d1 = DateTime.Now;
static Timer _timer = null;
static void Main(string[] args)
{
_timer = new Timer(Callback, null,200, Timeout.Infinite);
d1 = DateTime.Now;
Console.ReadLine();
}

private static void Callback(Object state)
{
TimeSpan s = DateTime.Now - d1;
Console.WriteLine("Done, took {0} secs.", s.Milliseconds);
_timer.Change(200, Timeout.Infinite);
}

在运行它时我希望显示:

Done, took 200 milsecs.
Done, took 200 milsecs.
Done, took 200 milsecs.
Done, took 200 milsecs.
Done, took 200 milsecs.
Done, took 200 milsecs.

但事实并非如此。

我得到“毫秒”的随机值。

注意我的实际代码不会总是使用 200 毫秒。

示例截图:

enter image description here

最佳答案

首先,您使用的是 TimeSpan.Milliseconds 属性,它是一个 int 并且只返回时间跨度的毫秒 部分。为确保您获得全职,请使用 TotalMilliseconds

其次,您没有在每个循环中重置 d1,因此您会看到 时间,而不是每次迭代的时间。要解决此问题,请确保在回调结束时设置 d1 = DateTime.Now,以便下一个循环使用正确的时间。

最后,由于线程、方法调用甚至您正在执行的减法操作的开销,您可能会看到某种差异而不是完美的 200 毫秒间隔。此外,DateTime 并不总是最准确的 - 根据 this article from Eric Lippert :

If the question you want to ask is about how long some operation took, and you want a high-precision, high-accuracy answer, then use the StopWatch class.

因此:

static Stopwatch _watch = Stopwatch.StartNew();
static Timer _timer = null;
static void Main(string[] args)
{
_timer = new Timer(Callback, null,200, Timeout.Infinite);
Console.ReadLine();
}

private static void Callback(Object state)
{
TimeSpan s = _watch.Elapsed;
_watch.Restart();
Console.WriteLine("Done, took {0} secs.", s.TotalMilliseconds);
_timer.Change(200, Timeout.Infinite);
}

关于c# - System.Threading 回调似乎不太准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30442382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com