我从ITCH协议服务器收到大量数据(频繁的小消息)。
我的应用程序运行良好,因为所有邮件都已正确解析。但是,当我在“ReadByte”中设置代码时,除非代码设置为“ReadByte”,否则我会发生神秘的延迟(据我所知)没有任何事情发生。
TcpClient simpleTcp = new TcpClient(serverAddress, serverPort);
simpleTcp.NoDelay = true;
simpleTcp.Client.NoDelay = true;
simpleTcp.Client.ReceiveBufferSize = 1024;
simpleTcp.ReceiveBufferSize = 1024;
simpleTcp.ReceiveTimeout = 5000;
NetworkStream tcpStream = simpleTcp.GetStream();
//Send login and subscciptions...
while (true)
{
lock (TcpLock)
{
int abyte = tcpStream.ReadByte();
try
{
LbTime.Stopwatch.Restart();
Console.WriteLine("\n>>>>GetMessage Start: " + DateTime.UtcNow.ToString("HH:mm:ss.fff") + " " + LbTime.Stopwatch.ElapsedMilliseconds.ToString("F0"));
//Process message (Complex)
Console.WriteLine(">>>>GetMessage End: " + LbTime.Stopwatch.ElapsedMilliseconds.ToString("F0") + " Now: " + DateTime.UtcNow.ToString("HH:mm:ss.fff") + "\n");
}
catch (Exception err)
{
throw;
}
}
}
我显示处理开始和结束的时间。但是,当我收到稍后的消息时 - 时间与收到的消息中埋藏的时间差别很大。即我迟到了。
我在2台机器上尝试了这个,后者没有其它机器运行,有时候我仍然会有神秘的延迟。
我认为这很难帮助,因为我无法提供一个工作示例,因为它依赖于连接到私有ITCH协议服务器。
如果任何人能够散发出一些很棒的光。
答案 0 :(得分:0)
这种延迟对我来说仍然莫名其妙。但是,对类似问题的几个答案表明使用原始套接字会更好。
我用Socket替换了所有的Stream和NetworkStream,现在Socket.Receive()没有任何特别的延迟。