我得到了这个 Socket.Send 代码,我的协议(protocol)是 tcp。
byte[] commandBytes = Encoding.ASCII.GetBytes(command);
int iBytesSent = socket.Send(commandBytes, commandBytes.Length, SocketFlags.None);
Debug.WriteLine("SEND: " + command);
我有超过 10,000 个命令要发送,每个命令大约有 100 个字符。 我在 foreach 循环中调用 Socket.Send 来执行 10,000 个命令。
我通知 Socket.Send 代码会阻塞当前线程并需要很长时间才能完成。 (debug.WriteLine 停止打印到输出控制台。)
所以我的问题:
是否有可能是因为我发送命令太快而导致流已满?
所以它必须等到流可用并继续发送?
我还注意到 Socket.Send 会阻塞代码 5-10 秒,然后继续。 但随着时间的推移,5-10 秒变成了 20-30 秒,然后就花很长时间了。
最佳答案
是的,Send
可能会被阻止,尽管在大多数代码中您很少看到它。如果您不想占用线程,可以使用异步套接字 IO(BeginSend
/EndSend
或 SendAsync
)。然而,这并没有使它变得更快 - 它只是意味着当套接字繁忙时您不会阻塞线程。您是否可能超过了此连接的另一端?
关于c# - Socket.Send 是否有可能阻塞代码并需要永远完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23672735/