Socket.Blocking 的目的
Purpose of Socket.Blocking
我在 C# 中使用 Begin/EndAccept/Send/Receive 套接字方法有一段时间了,但直到最近才发现 System.Net.Sockets
的 Blocking bool 选项
这是更好的选择吗?如果不是,指定您的 Socket 是否应该阻塞的目的是什么?它只是一个有用的指标,表明开发人员是否已选择实施 blocking/non-blocking 方法?
尝试在阻塞套接字上调用 Receive 意味着调用不会 return 直到数据到达。使用阻塞套接字时,您的线程实际上会停止,直到数据可用。因此,如果您尝试在 Winforms 应用程序的 UI 线程上执行套接字 I/O,您的 UI 将无响应并冻结,直到数据到达。
非阻塞套接字允许您的代码执行其他操作。如果您在非阻塞套接字上调用 Receive
,如果没有可用数据,它将立即 return。非阻塞套接字通常与周期性轮询机制、"select" 样式等待调用或其他指示数据可用的通知机制结合使用。 .NET 还在套接字上提供 BeginReceive 方法作为另一种选择。
"blocking" 和 "non-blocking" 之间的选择是一种设计选择。选择会影响线程模型(或线程模型会影响决策)。两者都有设计意义。
.NET 的早期版本不提供 BeginReceive IIRC。 async-await 直到很久以后才出现在 .NET 版本中。大多数平台上的传统套接字模型只是 "send" 和 "recv" 以及设置非阻塞模式的选项。
我在 C# 中使用 Begin/EndAccept/Send/Receive 套接字方法有一段时间了,但直到最近才发现 System.Net.Sockets
的 Blocking bool 选项这是更好的选择吗?如果不是,指定您的 Socket 是否应该阻塞的目的是什么?它只是一个有用的指标,表明开发人员是否已选择实施 blocking/non-blocking 方法?
尝试在阻塞套接字上调用 Receive 意味着调用不会 return 直到数据到达。使用阻塞套接字时,您的线程实际上会停止,直到数据可用。因此,如果您尝试在 Winforms 应用程序的 UI 线程上执行套接字 I/O,您的 UI 将无响应并冻结,直到数据到达。
非阻塞套接字允许您的代码执行其他操作。如果您在非阻塞套接字上调用 Receive
,如果没有可用数据,它将立即 return。非阻塞套接字通常与周期性轮询机制、"select" 样式等待调用或其他指示数据可用的通知机制结合使用。 .NET 还在套接字上提供 BeginReceive 方法作为另一种选择。
"blocking" 和 "non-blocking" 之间的选择是一种设计选择。选择会影响线程模型(或线程模型会影响决策)。两者都有设计意义。
.NET 的早期版本不提供 BeginReceive IIRC。 async-await 直到很久以后才出现在 .NET 版本中。大多数平台上的传统套接字模型只是 "send" 和 "recv" 以及设置非阻塞模式的选项。