C# 如何确保NetworkStream在不关闭流或TCP客户端的情况下立即发送数据?

C# 如何确保NetworkStream在不关闭流或TCP客户端的情况下立即发送数据?,c#,tcpclient,C#,Tcpclient,我有一个非常简单的代码片段,它试图通过TcpClient及其关联的NetworkStream发送数据 var client = new TcpClient("xxx.xxx.xxx.xxx", 1234); NetworkStream stream = client.GetStream(); byte[] buffer = Encoding.ASCII.GetBytes(str); stream.Write(buffer, 0, buffer.Length); 我发现数据通常不会在stream

我有一个非常简单的代码片段,它试图通过
TcpClient
及其关联的
NetworkStream
发送数据

var client = new TcpClient("xxx.xxx.xxx.xxx", 1234);
NetworkStream stream = client.GetStream();
byte[] buffer = Encoding.ASCII.GetBytes(str);
stream.Write(buffer, 0, buffer.Length);
我发现数据通常不会在
stream.Write()
之后立即发送。如果我添加
client.Close()
stream.Close()
则会发送数据。但是,在我的例子中,我正在尝试等待服务器发送一些ACK消息,因此我希望重用原始的
NetworkStream
,而不关闭
TcpClient
NetworkStream
。如何做到这一点?

设置为
true
,以便不使用该选项

从MSDN库文档中:

当NoDelay为
false
时,TCP客户端在收集大量传出数据之前不会通过网络发送数据包。由于TCP段中存在大量开销,因此发送少量数据效率低下。但是,确实存在这样的情况,即您需要发送非常少量的数据,或者希望发送的每个数据包都能立即响应。您的决策应该权衡网络效率与应用程序需求的相对重要性


@BradleyDotNET:我的意思是套接字将尝试立即发送数据流,而不考虑网络延迟。定义“立即”。的确,对于对流的较小写入,Nagle算法将短暂延迟传输(远小于一秒),如果您愿意,确实可以关闭它。但在实践中,与禁用它所带来的效率低下相比,延迟的问题要小得多。强烈建议您不要禁用它。请注意,文档并不完全正确:“TcpClient在收集大量传出数据之前不会通过网络发送数据包”。它只会短暂延迟传输(约500毫秒,具体取决于实现)。如果在此期间之后,数据量仍然不“重要”,则将发送数据。Nagle不会导致长时间的传输延迟,通常不应该禁用它,因为它提供了重要的好处。至少,在提出这个解决方案之前,应该充分理解最初的问题。@Peter:Wikipedia说(没有任何引用):“一般来说,由于Nagle的算法只是针对粗心应用程序的一种防御,它不会对精心编写的应用程序带来好处,因为它会适当地处理缓冲;该算法要么没有效果,要么对应用程序有负面影响。“我不同意这种说法。应用程序没有理由必须自己进行缓冲,这样做不会产生任何效果。它仍然需要等待新的数据,如果时间太长而没有足够的时间,它还必须能够继续发送大小不足的数据包。也就是说,这只是重新发明轮子。事实上,如果确实禁用了它,那么最好让他们知道自己的代码正在正确缓冲,否则网络带宽的低效使用实际上是有保证的。