我遇到了一个问题, C# 启动时间缓慢, 导致 UDP 软件包开始下降。 下面, 我是为了减轻启动延迟而做的。 我基本上在前两个软件包传输之间再等10米。 这至少可以修补机器上的初始滴落。 我担心的是, 慢一点的机器可能需要比这个更长时间的延迟 。
private void FlushPacketsToNetwork()
{
MemoryStream packetStream = new MemoryStream();
while (packetQ.Count != 0)
{
byte[] packetBytes = packetQ.Dequeue().ToArray();
packetStream.Write(packetBytes, 0, packetBytes.Length);
}
byte[] txArray = packetStream.ToArray();
udpSocket.Send(txArray);
txCount++;
ExecuteStartupDelay();
}
// socket takes too long to transmit unless I give it some time to "warm up"
private void ExecuteStartupDelay()
{
if (txCount < 3)
{
timer.SpinWait(10e-3);
}
}
因此,我想知道是否有更好的方法让 C# 充分装载其所有依赖性? 我真的不介意它需要几秒钟来完全装载; 我只是不想做任何高带宽传输,直到 C# 完全准备就绪。
Additional relevant details
这是一个控制台应用程序, 网络传输是从一条单独的线线运行的, 主线只是等待按键终止网络发报机 。
在 program.Main
方法中,我试图通过使用最高优先级的合理方法,从我的申请中获取最大性能:
public static void Main(string[] args)
{
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
...
Thread workerThread = new Thread(new ThreadStart(worker.Run));
workerThread.Priority = ThreadPriority.Highest;
workerThread.Start();
...
Console.WriteLine("Press any key to stop the stream...");
WaitForKeyPress();
worker.RequestStop = true;
workerThread.Join();
此外,我目前使用的套接字设置如下:
udpSocket = new Socket(targetEndPoint.Address.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp);
udpSocket.Ttl = ttl;
udpSocket.SendBufferSize = 1024 * 1024;
udpSocket.Blocking = true;
udpSocket.Connect(targetEndPoint);
默认的 < code> SendBofferSize 是 8192, 所以我把它移动到一个兆字节, 但这个设置似乎对开始时的投放包没有影响 。