每 20 毫秒发送一个音频数据包

Sending an audio packet every 20 milliseconds

我有一个应用程序需要通过 UDP 发送音频数据包。为了避免抖动,我想安排一个线程或任务每 20 毫秒执行一次此任务。伪代码如下所示:

while(true) 
{
    byte[] packet = GetNextPacket();
    socket.Send(packet);
    var waitUntill = DateTime.Now.AddMilliseconds(20);
    while(DateTime.Now < waitUntill) { }
}

这工作正常,但它使用了 100% 的 CPU 内核。这当然是不可取的。我试过玩 Thread.SleepThread.Yield 以及它们的等效任务,但在所有情况下,我要么以 100% 负载结束,要么体验极度紧张(这是可以预料的)。

在 C# 中没有办法以如此细粒度的级别安排任务吗?我不需要 100% 的保证(Windows 不是实时的 OS),但大多数情况下都可以。请注意,我并不担心 GC :).

我可以调用任何 COM 代码来实现此目的,但我的理想解决方案是多平台。我目前使用的是 dotnet core 3.0.

如果在 C# 中无法实现,那么如何在执行此类任务的 C++ 等语言中实现。

System.Threading.Timer 对象就是为这类事情设计的,尽管我从来没有在这么短的时间间隔内使用过它。

var timer = new Timer(_ => socket.Send(GetNextPacket()), null, 0, 20);

考虑使用多媒体计时器:

High resolution timer in C#

它们专为此类高分辨率应用而设计。