我有一个多线程C#程序,其中每个线程使用TcpClient同步接收来自多个服务器的面向文本/行的数据。
它运行2年没有错误,但是当提供服务器的供应商发生变化时,我们开始发现供应商服务器程序缓冲区溢出的问题,并且他们的修复(显然)阻止了它们进行核心转储,而且他们停止发送给我们。但它们并没有拆除TCP连接,因此双方都将其显示为ESTABLISHED。
供应商告诉我们,如果在可配置的超时后没有收到数据,只需实现超时并重新建立连接,另一位客户就可以解决这个问题。
由于我使用同步模型实现我的线程(本质上是'而readline()'),我可以使用TcpClient ReceiveTimeout属性并期望它正常工作吗?我尝试使用更简单的非线程版本,它似乎工作第一个循环,但后来没有。
我真的不想重写程序以使用异步套接字模型。
对于使用同步TcpClient进行超时的简单方法的任何建议都将非常感激。
米奇
附录:当我在ReadLine()上收到异常时,我关闭了TcpClient并重新开始,就好像我收到了网络断开连接一样。由于"没有工作",我的意思是它在几次之后停止了超时,即使1.)我仍然没有被发送任何东西2.)我坐在ReadLine()中被阻塞。 / p>
答案 0 :(得分:1)
ReceiveTimeout
仅适用于同步IO。 There is no timeout for async socket reads.如果ReceiveTimeout
不适合您,则会有一些错误从问题中提供的信息中显而易见。在那种情况下发布repro代码。