2014-10-20 64 views
1

我有一个多线程C#程序,其中每个线程使用TcpClient同步接收来自多个服务器的面向文本/行的数据。使用TcpClient ReceiveTimeout与同步程序

它已经运行了2年没有错误,但是当提供服务器的供应商发生变化时,我们开始发现供应商服务器程序缓冲区溢出并且它们的修复(显然)阻止它们进行核心转储的问题,但他们也停止发送给我们。但是它们不会拆除TCP连接,所以双方都将其显示为ESTABLISHED。

供应商告诉我们,如果在可配置的超时后没有收到数据,另一个客户只需实施超时并重新建立连接,就可以解决此问题。因为我使用同步模型(本质上,'while readline()')实现了我的线程,我可以使用TcpClient ReceiveTimeout属性并期望它能正常工作吗?我尝试了一个更简单的非线程版本,它似乎可以在第一个循环中工作,但不会在之后。

我真的不想重写程序来使用异步套接字模型。

有关使用同步TcpClient超时的简单方法的任何建议将不胜感激。

米奇

附录:当我收到的的ReadLine()例外,我不关闭的TcpClient,并开始了,就像我收到了网络断开。通过“不工作”,我的意思是在几次后停止超时,即使1)我仍然没有被发送任何东西,2)我坐在一个ReadLine()中被阻塞。

+0

请详细说明“这似乎是第一个循环,但不是事后”。请注意,一旦在套接字上发生故障(包括超时),您必须关闭它并重新开始。 – 2014-10-20 17:34:08

回答

1

ReceiveTimeout只有与同步IO协同工作。 There is no timeout for async socket reads.如果ReceiveTimeout不适合你,那么在问题中给出的信息中有一些不明显的错误。在这种情况下,重新发布代码。

+0

好吧,我明天会重新测试...如果事情还没有正常工作,我会回来的... – mitchmcc 2014-10-20 18:35:33

+0

仅供参考,它看起来像现在正在工作...不知道为什么我以为它没有之前(? )。谢谢您的帮助。 – mitchmcc 2014-10-21 13:39:13