私は、次のコードを使用して、可能な限り私のUDPデータ収集ソケットからできるだけ多く絞るしようとしていますよ:高性能UDPサービス.NET
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);
にスレッドプールを微調整してきました。しかし、私は正直だ場合、これは、パフォーマンスに大きな影響を持つように表示されません。
msyncでAsyncBeginReceive()を見つけることができません。あなたが提案できる参考資料はありますか?ありがとう。 –
元の質問のコードのメソッドです。おそらくあなたが使いたいと思う 'socket.BeginReceiveFrom()'を呼び出します:) –