4

我正在使用 SocketAsyncEventArgs 与数百台设备(其中大部分通过 GPRS)进行通信。有时,它们中的一些停止响应并且似乎我无法使操作超时,因为文档指出超时选项(即SocketOptionName.SendTimeout)不适用于异步通信。

我正在寻找一种在进行发送/接收/连接异步时检查超时的方法。它不应该阻塞线程(因此,调用 someMonitor.WaitOne(SomeTimeoutValue) 不会这样做)并且我不想为每个操作创建一个计时器实例(因为设备的数量肯定会增加)。

对此有什么建议吗?

4

1 回答 1

2

这是我的做法(虽然我不喜欢这个解决方案):

这个想法是有一个计时器,当它被触发时,它会检查所有挂起的操作是否超时。我创建了一个我的异步客户端实现的接口:

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

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

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

因此,客户端Begin在启动异步操作时引发End事件,并在完成时引发事件。另一方面,我创建了一个 TimeoutManager,它有一个异步客户端集合和一个包含操作及其启动时间的字典。创建新客户端时,它会注册到TimeoutManager订阅事件的 . 使用TimeoutManageraSystem.Threading.Timer检查哪些操作超时。如果它有超时,那么它调用DoTimeout方法(从ITimeoutable接口)。

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

于 2012-02-17T16:53:31.063 回答