我对C#中的套接字使用Begin/EndAccept/发送/接收方法已有一段时间了,但直到最近才发现System.Net.Sockets的阻塞bool选项
这是一个更好的选择吗?如果没有,指定您的套接字是否应该阻塞的目的是什么?它仅仅是一个有用的指标,说明开发人员是否选择了实现阻塞/非阻塞方法?
发布于 2016-10-14 04:53:23
试图在阻塞套接字上调用接收调用意味着在数据到达之前调用不会返回。当使用阻塞套接字时,线程会被有效地停止,直到数据可用为止。因此,如果您尝试在Winforms应用程序的UI线程上执行套接字I/O,您的UI将在数据到达之前没有响应和冻结。
非阻塞套接字允许您的代码做其他事情。如果您在非阻塞套接字上调用Receive,如果没有可用的数据,它将立即返回。非阻塞套接字通常与周期性轮询机制、"select“样式等待调用或其他通知机制结合使用,以指示数据可用。.NET还提供了套接字上的BeginReceive方法作为另一种选择。
在“阻塞”和“非阻塞”之间的选择是一种设计选择。选择要么影响线程模型(或者线程模型影响决策)。两者都有设计意义。
早期版本的.NET没有提供BeginReceive IIRC。异步等待直到很久以后才出现在.NET版本中。传统的套接字模型在大多数平台上只是“发送”和"recv“,可以选择设置非阻塞模式。
https://stackoverflow.com/questions/40033946
复制相似问题