等待网络 C# 控制台应用程序完全启动

本文关键字:启动 应用程序 控制台 网络 等待 | 更新日期: 2023-09-27 18:34:53

>我遇到了一个问题,即 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# 准备好全速之前进行任何高带宽传输。

其他相关详细信息

这是一个控制台应用程序,网络传输从单独的线程运行,主线程只需等待按键终止网络发送器。

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);

默认SendBufferSize是 8192,所以我继续将其移动到兆字节,但此设置似乎对开始时丢弃的数据包没有任何影响。

等待网络 C# 控制台应用程序完全启动

从评论中我了解到TCP不适合您(由于传输中固有的延迟(,您也不想由于另一端未完全加载而丢失数据包。

因此,您实际上需要以更健壮和轻量级的方式实现TCP(重传(中存在的一些功能。我还假设您控制了接收方。

我建议您发送一些预定数量的数据包。然后等待确认。例如,每个数据包都可以有一个不断增长的 id。每N个数据包,接收应用程序向发送方发送最后接收的数据包数。收到此号码后,发送者将知道是否需要重复最后N个数据包。

这种方法不会对您的带宽造成太大损害,您将获得有关接收数据的某种信息(尽管不能保证(。

否则,最好切换到 TCP。顺便问一下,你试过使用TCP吗?您的带宽因此受到多大的伤害?