我正在编写Windows服务,该服务实现了一个TCP服务器,该服务器从少量(
在TAP之前的日子里,我会为每个客户端使用一个单独的线程编写此代码,并阻塞NetworkStream.Read(),并设置超时以检测客户端何时未在给定间隔内报告。
我喜欢我在https://social.technet.microsoft.com/wiki/contents/articles/30394.simple-multi-user-tcpip-client-server-using-tap.aspx找到的Reed Kimble编写的TCP / IP客户端和服务器的TAP解决方案。但是,我正在努力处理一个或多个客户未及时报告的情况。我在ProcessClientAsync中的(伪)代码如下:
read = 1
while read>0 {
read = Await stream.ReadAsync(buffer,buffer.Length,Cancel)
if read > 0 then {
if I have a complete message from this client then {
if I have current timestamped data for ALL clients then {
' need to detect missing client(s) here...
DoProcessData() ' Maybe using Task.Run...
}
}
}
}
我看到的一个建议是添加一个Task.Delay()与ReadAsync一起运行,并使用Await Task.WhenAny而不是直接等待ReadAsync。有没有更好的方法来处理这种情况?
对于我的用例而言,使用TAP解决方案似乎是正确的主意吗?我见过的大多数异步代码示例都包含一个UI(我没有)。在没有GUI的服务器端(尤其是在服务内部)使用服务器时,我找不到很多建议。
最后,在声明超时之前,我应该等待一个预期的数据包到达多长时间的标准值?我应该提到的客户是固定位置的蜂窝调制解调器,通常具有良好的信号强度,可以连接到数据采集设备...