c# - Socket.Send 是否有可能阻塞代码并需要永远完成?

标签 c# sockets asynchronous tcp asyncsocket

我得到了这个 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/EndSendSendAsync)。然而,这并没有使它变得更快 - 它只是意味着当套接字繁忙时您不会阻塞线程。您是否可能超过了此连接的另一端?

关于c# - Socket.Send 是否有可能阻塞代码并需要永远完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23672735/

相关文章:

c# - 在执行其他命令之前更改表单

c# - 想在 ASP.NET MVC 中每天执行一次查询

Java套接字服务器使Windows Server 2003的网络死机

php - 在 PHP 中正确快速地进行 TELNET 的方法。套接字或 curl

javascript - 如何从异步调用返回响应?

c# - 如何检测是否调试

c# - 合并两个集合,但仅适用于具有匹配 id 的对象

Windows 上的 Python 多处理和网络

node.js - Protractor 等待预期检查中使用的异步函数

javascript - Node js异步 waterfall 未按顺序传递变量