我应该使用while(true)从Socket接收数据吗?

jav*_*red 8 c# sockets

请参阅我之前的问题以获取代码示例套接字:有时(很少)数据包在接收期间丢失

我需要始终从UDP多播套接字接收数据.这是单向通信我只需要监听新数据并尽快处理它.

我应该用while(true)吗?我不喜欢,while(true)因为在我看来,这为处理器带来了很多额外的工作.可能c#提供其他回叫技术或其他什么?

Mar*_*ell 4

2 到 6 个套接字(评论)可能是一个有趣的地方,阻塞或异步 IO 都可以正常工作,因为您不会用线程淹没机器。每秒 2000 个数据包,听起来有足够多的数据可以让线程保持忙碌。while(true)性能角度来看,您无需担心,因为该Receive方法将阻塞直到数据可用,因此它永远不会执行不执行任何操作的热循环。然而!就我个人而言,从美观的角度来看,我同意while(true)这是一个不必要的污点,所以如果您使用阻塞方法,也许可以考虑:

int bytesRead;
while((bytesRead = socket.Receive(buffer)) > 0) {
    // process bytesRead from buffer
}
Run Code Online (Sandbox Code Playgroud)

当套接字关闭时,它将干净地退出。

还可以BeginReceive使用和方法来执行此操作Socket.ReceiveAsync,该方法不使用阻塞调用,而是使用事件或回调。这些在处理大量连接时特别有用。

就我个人而言,我倾向于做的是使用Socket.Available;如果这是肯定的,则有数据被缓冲并准备好使用,因此Receive可以使用简单的方法来立即获取该数据,而无需上下文切换。如果它为零,则当前没有可用数据,因此异步调用可能更合适。这平衡了上下文切换和直接调用。请注意,该ReceiveAsync方法也通过返回值内置了此功能ReceiveAsync(如果true操作未完成,则稍后将调用回调 -false如果操作已完成,则不会调用回调)。