【发布时间】:2019-06-27 03:40:12
【问题描述】:
我必须使用一个使用 TCP 连接来控制它的设备。它每 30 毫秒发送 1 个字节的数据,我必须尽快对其做出反应。通常,一切正常,但有时 Socket.ReceiveAsync() 函数会卡住长达 400-800 毫秒的时间,然后返回一些接收到的字节数。
我使用这样的代码:
_socket.ReceiveTimeout = 5;
var sw = Stopwatch.StartNew();
var len = await _socket.ReceiveAsync(new ArraySegment<byte>(Buffer, Offset, Count),
SocketFlags.None)
.ConfigureAwait(false);
_logger.Info($"Reading took {sw.ElapsedMilliseconds}ms"); // usually 0-6ms, but sometimes up to 800ms
我用Wireshark记录了这个过程,我可以看到所有的数据都及时收到了,大约30ms的间隔。
我还注意到,当您在计算机上执行某些操作时,发生这种延迟的可能性更高。就像打开开始菜单或资源管理器一样。我认为,切换到另一个进程或垃圾收集应该更快。
【问题讨论】:
-
“我认为,切换到另一个进程或垃圾收集应该快得多。” - 也许,但是:你不能影响它;您以这种方式读取了多少个套接字?如果该数字非常低(意思是:一或两个),并且如果延迟是您最关心的问题,您可能希望使用同步 API 而不是异步 API,并且只需承担几乎所有时间都被阻塞的线程的成本?
-
当您需要一些实时处理措施时,您不能这样做,请参阅this
标签: c# .net sockets async-await