2012-02-16 52 views
3

我正在使用SocketAsyncEventArgs与数百个设备(其中大多数通过GPRS)进行通信。有时,其中一些停止响应,看起来我无法将操作超时,因为文档指出超时选项(即SocketOptionName.SendTimeout)在异步通信中不起作用。与SocketAsyncEventArgs进行异步套接字通信的超时

我正在寻找一种检查超时发送/接收/ ConnectAsync的方法。它不应该阻塞线程(所以,调用someMonitor.WaitOne(SomeTimeoutValue)不会),我不希望每个操作创建一个计时器实例(因为设备数量肯定会增加)。

对此有任何提示?

+0

您使用哪种传输协议?也许有一个包装类,像[UDPClient](http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx)或TCP类已经解决了你的问题? – HaMster 2013-08-18 17:20:42

回答

2

这里是我是如何做到的(altough我不喜欢这个解决方案):

的想法是有一个计时器,发射时,检查所有挂起操作的超时。 我创造了我的异步客户端实现的接口:

public interface ITimeoutable { 
    event Action<ITimeoutable, Operation> Begin; 
    event Action<ITimeoutable, Operation> End; 
    void DoTimeout(Operation operation); 
} 

,其中操作是一个枚举,定义为:

public enum Operation { 
    Connect, 
    Send, 
    Receive, 
    Disconnect 
} 

因此,客户提出了一个Begin事件开始一个异步操作时,提高了End事件结束时。另一方面,我创建了一个TimeoutManager,它包含一组异步客户端和一个包含操作的字典以及它们启动的时刻。当一个新的客户被创建时,它被注册到订阅事件的TimeoutManagerTimeoutManager使用System.Threading.Timer来检查哪些操作超时。如果它有超时,那么它调用DoTimeout方法(从ITimeoutable接口)。

这是一个相当复杂的代码,我不喜欢它。但它的工作。