在.NET应用程序中需要微秒延迟来限制UDP多播传输速率

我正在C#中编写UDP多播客户端/服务器对,我需要50-100μsec(微秒)的延迟来限制服务器传输速率。 这有助于避免重大数据包丢失,还有助于防止磁盘I / O绑定的客户端过载。 请不要建议Thread.Sleep或Thread.SpinWait。 我不会问我是否需要其中任何一个。

我的第一个想法是使用某种高性能的计数器并做一个简单的while()循环来检查已用时间,但我想避免这种情况,因为它感觉很笨拙。 那不会也会占用服务器进程的CPU利用率吗?

跨平台解决方案的奖励积分,即不是Windows特定的。 先谢谢你,伙计们!

我会使用秒表,但需要一个循环

阅读此内容可为秒表添加更多扩展名,例如ElapsedMicroseconds

或类似的东西也可能有用

System.Diagnostics.Stopwatch.IsHighResolution 必须是真的

static void Main(string[] args) { Stopwatch sw; sw = Stopwatch.StartNew(); int i = 0; while (sw.ElapsedMilliseconds <= 5000) { if (sw.Elapsed.Ticks % 100 == 0) { i++; /* do something*/ } } sw.Stop(); } 

非常短的睡眠时间通常最好通过CPU旋转循环(就像你描述的那种)来实现。 您通常希望避免使用高精度计时器调用,因为它们本身可能会占用时间并使结果出现偏差。 我不会太担心服务器上的CPU挂起这么短的等待时间。

我会将行为封装在一个类中,如下所示:

  • 创建一个类,其静态构造函数运行一个旋转循环数百万次迭代并捕获它需要多长时间。 这可以让您了解单个循环周期对底层硬件的持续时间。
  • 计算可用于计算任意hibernate时间的uS /迭代值。
  • 当被要求睡眠特定时间段时,通过先前计算的uS /迭代值将uS划分为睡眠以识别要执行多少循环迭代。
  • 使用while循环旋转,直到估计的时间过去。

当我需要更高精度的多播应用程序时,我遇到过这样的要求。

我发现最好的解决方案在于MultiMedia定时器,如本例所示 。

我已经使用了这个实现并添加了TPL异步调用。 您应该看到我的SimpleMulticastAnalyzer项目以获取更多信息。

你看过多媒体计时器了吗? 您可能会在某处找到一个包含API调用的.NET库。

我不鼓励使用旋转循环,因为它消耗并创建阻塞线程。 thread.sleep更好,它在睡眠期间不使用处理器资源,它只是切片时间。 尝试一下,您将从任务管理器中看到CPU使用率如何与旋转循环一起峰值。

  static void udelay(long us) { var sw = System.Diagnostics.Stopwatch.StartNew(); long v = (us * System.Diagnostics.Stopwatch.Frequency )/ 1000000; while (sw.ElapsedTicks < v) { } } static void Main(string[] args) { for (int i = 0; i < 100; i++) { Console.WriteLine("" + i + " " + DateTime.Now.Second + "." + DateTime.Now.Millisecond); udelay(1000000); } }