gpt4 book ai didi

c# - 我如何*平均*每 20 毫秒触发一个事件?内置定时器 "creeps"

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

我正在编写一个 RTP 服务器来发布 PCMA 波形文件。它需要每 20 毫秒抽取一次数据(平均而言 - 对于任何 1 个抽取,它可以在数据的任意一侧,但必须平均为 20 毫秒)。

我当前的实现使用 Timer ,但随后该事件每 20 毫秒触发一次,因此它逐渐消失。

有更好的方法吗?我目前能想到的唯一方法是在计时器开始蠕变时动态调整计时器间隔,以使其恢复正常。

示例代码

void Main()
{
System.Timers.Timer timer = new System.Timers.Timer();

// Use a stopwatch to measure the "wall-clock" elapsed time.
Stopwatch sw = new Stopwatch();
sw.Start();

timer.Elapsed += (sender, args) =>
{
Console.WriteLine(sw.ElapsedMilliseconds);
// Simulate doing some work here -
// in real life this would be pumping data via UDP.
Thread.Sleep(300);
};

timer.AutoReset = true;
// I'm using an interval of 1 second here as it better
// illustrates the problem
timer.Interval = 1000;
timer.Start();
}

输出:

1002
2001
3002
4003
5003
6005
7006
8007
9007
10017
11018
12019
13019
14020 <-- By this point we have creeped over 20 ms in just 14 iterations :(

最佳答案

首先:我永远不会说得很准确,因为只要您在标准 Windows 上运行,您的程序就永远无法完全控制 CPU 正在做什么,因为它不是实时操作系统。试想反病毒软件启动,垃圾收集器卡住你的线程,一边玩游戏,......

那是说您也许可以补偿一点。

当处理程序启动时,暂停计时器,记录当前时间,采取行动,根据处理程序的启动和采取行动所花费的时间,通过将间隔设置为所需的间隔来更新时间间隔。

这样您可以更好地控制爬行。一个异常(exception)情况可能是表演时间比间隔时间长,以及间隔时间应该包含 Action 时间还是 Action 之间的时间。

根据我的经验,您不能依赖任何计时器来准确地获得这么小的间隔(20 毫秒),但对蠕变进行补偿会很有帮助。

关于c# - 我如何*平均*每 20 毫秒触发一个事件?内置定时器 "creeps",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24847670/

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