【发布时间】:2011-02-10 15:49:27
【问题描述】:
我正在尝试使用以下代码尽可能多地从我的 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
}
有人对如何改进有任何想法吗?从AsyncEndReceive() 调用AsyncBeginReceive() 是否被认为是最佳实践?
我已将线程池调整为
ThreadPool.SetMinThreads(20,20);
ThreadPool.SetMaxThreads(250, 250);
但老实说,这似乎对性能没有太大影响。
【问题讨论】: