当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在.NET应用程序中需要微秒延迟来限制UDP多播传输速率》经验,为你挑选了2个好方法。

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

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

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



1> LBushkin..:

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

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

创建一个类,其静态构造函数运行一个旋转循环数百万次迭代,并捕获它需要多长时间.这使您可以了解单个循环周期对底层硬件的持续时间.

计算可用于计算任意休眠时间的uS /迭代值.

当被要求睡眠特定时间段时,通过先前计算的uS /迭代值将uS划分为睡眠以识别要执行多少循环迭代.

使用while循环旋转,直到估计的时间过去.



2> Fredou..:

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

阅读此内容可为秒表添加更多扩展名,例如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();


    }


...现在你假设你得到一个可以被100完全分割的Tick计数.
如果你在Ticks达到99时获得200+纳秒的延迟会发生什么?不会导致你/不/陷阱,直到100蜱的后期倍数?
你将做点什么不同的?
推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有