gpt4 book ai didi

.net - 高性能UDP服务.NET

转载 作者:行者123 更新时间:2023-12-01 15:50:35 25 4
gpt4 key购买 nike

我正在尝试使用以下代码从我的UDP数据收集套接字中挤出更多的代码:

public void Start()
{

if (socket == null) Open();
this.stats.PositionServerStarted = DateTime.Now;
this.state = SocketWorkerState.Running;
AsyncBeginReceive();
}

private void AsyncBeginReceive()
{
DataPacket dataPacket = new DataPacket(socket, this.settings.IPAddress,
this.settings.Port, SocketWorker.MaxDataRead);
Interlocked.Increment(ref stats.ProcessingThreads);
socket.BeginReceiveFrom(dataPacket.BytePacket, 0,
SocketWorker.MaxDataRead, SocketFlags.None,
ref dataPacket.RemoteEndPoint, new AsyncCallback(AsyncEndReceive),
dataPacket);
}

private void AsyncEndReceive(IAsyncResult ar)
{
DataPacket dataPacket= null;
AsyncBeginReceive();
dataPacket = (DataPacket)ar.AsyncState;
dataPacket.EnteredQueue = DateTime.Now;
dataPacket.DataLength= dataPacket.SourceSocket.EndReceiveFrom(ar,
ref dataPacket.RemoteEndPoint);
Interlocked.Decrement(ref stats.ProcessingThreads);
Interlocked.Increment(ref this.stats.PacketsQueued);
ThreadPool.QueueUserWorkItem(new WaitCallback(OnPacketArrived),
dataPacket);
Interlocked.Decrement(ref this.stats.PacketsQueued);
}

private void OnPacketArrived(object packet)
{
//go ahead and process the packet
}

有没有人对如何改善这一点有任何想法?从 AsyncBeginReceive()调用 AsyncEndReceive()是否被视为最佳实践?

我将线程池调整为
ThreadPool.SetMinThreads(20,20);
ThreadPool.SetMaxThreads(250, 250);

但是,老实说,这似乎对性能没有太大影响。

最佳答案

就我个人而言,当您启动时,我会发布多个Recvs,这就是将AsyncBeginReceive()称为可调次数。这样,您不必等待下一个录制完成即可开始下一个录制。用非托管术语来说,总是有一个异步读取挂起通常是一个好主意,这样,如果可能的话,I/O子系统可以直接读入您的缓冲区-这可能会或可能不会转换为更高的性能,但很可能会转换为更少的丢失数据报。

您可能还希望增加套接字的recv缓冲区大小,因为这也将有助于防止数据报丢失。

我怀疑您是否需要调整线程池设置。在非托管代码中,您可以使用异步I/O处理小于5个线程的满负荷网络管道。您的250个远远超出了预期。

关于.net - 高性能UDP服务.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com