我正在使用通过aStreamWriter
实例化的
这样地
streamWriter = new StreamWriter(tcpClient.GetStream());
我对以下与异常有关的呼叫的行为感到困惑。当连接到的服务器断开连接,因此底层TCP客户机连接断开时,以下两个函数将意外地引发
Tcpstream
。这两行代码执行时没有引发任何异常。为什么?streamWriter.WriteLine(strBuffer);
streamWriter.Flush();
编辑:这篇特别的文章也帮助我理解了原因,除了专家的回复。
http://social.msdn.microsoft.com/Forums/sk/netfxnetcom/thread/b177a935-7430-4812-9555-f747748df1af
本质上,当调用streamwriter的writeline时调用networkstream.write,这将写入输出缓冲区并返回,而不阻塞,除非缓冲区已满。os维护的内部缓冲区包含未发送的数据,os将继续尝试发送这些数据,直到给定次数的尝试失败。
WriteLine将引发IOException,但不一定每次都会引发。
最佳答案
此问题与StreamWriter
无关,仅与NetworkStream
的行为有关。NetworkStream.Flush()
是一个no-op。特别是在接收者确认刷新之前发送的所有字节之前,is不会阻塞。
flush方法实现stream.flush方法;但是,由于networkstream没有缓冲,因此它对网络流没有影响。调用flush方法不会引发异常。
(来自NetworkStream.Flush Method (MSDN))
你会在某个时候得到你的例外,但那可能要晚得多。基本上NetworkStream
和操作系统都不知道tcp连接已经断开,因此它们不会引发异常。