c# - 与 SocketAsyncEventArgs 的异步套接字通信超时

标签 c# sockets asynchronous timeout socketasynceventargs

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

我正在寻找一种在执行 Send/Receive/ConnectAsync 时检查超时的方法。它不应该阻塞线程(因此,调用 someMonitor.WaitOne(SomeTimeoutValue) 不会)并且我不想为每个操作创建一个计时器实例(因为设备数量肯定会增加)。

有什么建议吗?

最佳答案

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

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

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 中。 TimeoutManager 使用 System.Threading.Timer 检查哪些操作超时。如果超时,则调用 DoTimeout 方法(来自 ITimeoutable 接口(interface))。

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

关于c# - 与 SocketAsyncEventArgs 的异步套接字通信超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315413/

相关文章:

无法将 TCP 套接字绑定(bind)到本地 IP

javascript - 在返回 Promise 的函数中调用递归回调

node.js - Javascript 异步函数正在等待响应而不等待

c# - Web 上下文中静态属性的影响

Java服务器套接字

C : error while writing file using UDP socket

python - 有没有办法在等待后检查我传递给协程的参数?

c# - C# 中具有多维键的哈希表

c# - 在 Linux 上用 C# 解析 NetBIOS 名称

c# - EPPlus:查找Excel中整行是否为空