Thread.Sleep,求助高手解答线程抢占CPU的机制

dingwei 2014-12-14 08:52:59
最近在做音频网络传输的项目,遇到了很奇怪的问题,希望有大侠可以帮助解答一下。

需求:
上位机要实时发送MP3数据流到下位机,走的UDP通信,每一包发送512字节,固定码率为128kbps的Mp3需要每32ms发送一包数据到下位机。
程序处理:
程序中开一个单独线程来读取文件并发送数据,关键的代码如下:
while(true)
{
byte[] data=new byte[512];
fileStream.Read(data,0,512);
udpClient.send(data,0,512,target);
Thread.Sleap(32);
}
问题:
大多数情况都是没问题的,用抓包工具抓出来的数据显示在32ms左右一包,但是有几个别MP3文件发送的频率却实47ms一包,导致终端播放的时候卡顿。如果这个时候在PC上开一个播放器,或者开一个网页,那么发送的频率就正常了,关闭播放器,或者网页,发送的频率又变成47ms了。而且在有的机器上还没有这个问题,这个真是搞不懂了,求求各位大侠能够不吝赐教啊。
...全文
364 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
phommy 2014-12-15
  • 打赏
  • 举报
回复
Thread.Sleep改用SpinWait.SpinUntil带TimeSpan的重载
於黾 2014-12-15
  • 打赏
  • 举报
回复
引用 5 楼 dingwei 的回复:
谢谢楼上的各位。 如果我把发送的包调大到1024字节,发送的频率变成64ms会不会好一点呢?
已经说了,不能精确定时 如果精确度允许误差在50ms以上,你再使用sleep 如果必须精确,就不要sleep,干脆一直占用CPU好了
dingwei 2014-12-15
  • 打赏
  • 举报
回复
谢谢楼上的各位。 如果我把发送的包调大到1024字节,发送的频率变成64ms会不会好一点呢?
threenewbee 2014-12-14
  • 打赏
  • 举报
回复
Thread.Sleep()并不能用于精确的定时。线程让出所有权32毫秒,不等于32毫秒后它会获得所有权。这才是“抢占式多任务”的意义所在。
rayyu1989 2014-12-14
  • 打赏
  • 举报
回复
单词都拼错了 你确定这代码是你复制出来的代码? fileStream.Read肯定需要消耗时间, 看你硬盘io了 另外 Sleep是有精度的,线程精度大概在16ms之间。 你需要更小的精度他可能无法满足你,需要自己实现 百度应该可以找到,至少我曾看过。 Sleep受到系统计时器和调度程序精度和准确性的影响,在任何情况下,都不能假设调用 sleep 就会按照指定的时间精确的挂起线程。
华芸智森 2014-12-14
  • 打赏
  • 举报
回复
估计是跟CPU降频有关. 使用 System.Threading.Timer 来发送吧. 或WINFORM的 TIMER 控件.

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧