gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:33:25 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com