async/await会影响tcpserver的性能吗?我在C#5.0中创建了一个Tcp服务器,并且在调用tcpListener.AcceptTcpClientAsync和networkStream.ReadAsync时使用了await关键字,但是当我使用ProcessExplorer检查服务器的CPU使用率时,我得到以下结果:TcpSyncVersion:10%CPU使用率Tcp异步版本:30%CPU使用率一半是内核使用率。此外,我通过向网络流的外观添加计数器来测量接收数据需要多长时间,异步版本循环120,000次,而同步版本循环2,500,000次。在每秒接收的消息中,当从3个不同的客户端接收消息时,异步版本比同步版本慢15%。为什么异步版本比同步版本使用更多CPU?这是因为async/await关键字吗?异步Tcp服务器比同步服务器慢是正常的吗?编辑:这是异步tcp服务器代码的示例publicclassAsyncTcpListener:ITcpListener{//自定义类来存储IpAddress和PortpublicboolIsRunning{get;私有集;}privatereadonlyList_tcpClientConnections=newList();私人TcpListener_tcpListener;publicAsyncTcpMetricListener(){_serverEndPoint=GetServerEndpoint();}publicasyncvoidStart(){IsRunning=true;RunTcpListener();}privatevoidMessageArrived(byte[]buffer){//反序列化监听}privatecp){_tcpListener=null;尝试{_tcpListener=newTcpListener(_serverEndPoint.IpAddress,_serverEndPoint.Port);_tcpListener.Start();while(true){vartcpClient=await_tcpListener.AcceptTcpClientAsync().ConfigureAwait(false);=newAsyncTcpClientConnection(tcpClient,MessageArrived);_tcpClientConnections.广告d(asyncTcpClientConnection);}}最后{if(_tcpListener!=null)_tcpListener.Stop();IsRunning=false;}}publicvoidStop(){IsRunning=false;_tcpListener.Stop();_tcpClientConnections.ForEach(c=>c.Close());}}对于每个新客户端,我们创建一个新的AsyncTcpConnectionpublicclassAsyncTcpClientConnection{privatereadonlyAction_messageArrived;私有只读TcpClient_tcpClient;publicAsyncTcpClientConnection(TcpClienttcpClient,ActionmessageArrived){_messageArrived=messageArrived;_tcpClient=tcpClient;ReceiveDataFromClientAsync(_tcpClient);}privateasyncvoidReceiveDataFromClientAsync(TcpClienttcpClient){varreadBuffer=newbyte[2048];//PacketProtocol类来自http://blog.stephencleary.com/2009/04/sample-code-length-prefix-message.htmlvarpacketProtocol=newPacketProtocol(2048);packetProtocol.MessageArrived+=_messageArrived;尝试{使用(tcpClient)使用(varnetworkStream=tcpClient.GetStream()){intreadS大小;while((readSize=awaitnetworkStream.ReadAsync(readBuffer,0,readBuffer.Length).ConfigureAwait(false))!=0){packetProtocol.DataReceived(readBuffer,readSize);}}}catch(Exceptionex){//日志}}publicvoidClose(){_tcpClient.Close();}}EDIT2:同步服务器publicclassTcpListener:ITcpListener{privatereadonlyObserverEndpoint_serverEndPoint;私有只读列表_tcpClientConnections=newList();私有线程_listeningThread;私人TcpListener_tcpListener;公共布尔IsRunning{得到;私有集;}publicTcpMetricListener(){_serverEndPoint=GetServerEndpoint();}publicvoidStart(){IsRunning=true;_listeningThread=BackgroundThread.Start(RunTcpListener);}publicvoidStop(){IsRunning=false;_tcpListener.Stop();_listeningThread.Join();_tcpClientConnections.ForEach(c=>c.Close());}privatevoidMessageArrived(byte[]buffer){//反序列化}privatevoidRunTcpListener(){_tcpListener=null;特y{_tcpListener=newTcpListener(_serverEndPoint.IpAddress,_serverEndPoint.Port);_tcpListener.Start();while(true){vartcpClient=_tcpListener.AcceptTcpClient();_tcpClientConnections.Add(新的TcpClientConnection(tcpClient,MessageArrived));}}最后{if(_tcpListener!=null)_tcpListener.Stop();IsRunning=false;}}}和连接publicclassTcpClientConnection{privatereadonlyAction_messageArrived;私有只读TcpClient_tcpClient;私有只读任务_task;publicTcpClientConnection(TcpClienttcpClient,ActionmessageArrived){_messageArrived=messageArrived;_tcpClient=tcpClient;_task=Task.Factory.StartNew(()=>ReceiveDataFromClient(_tcpClient),TaskCreationOptions.LongRunning);}privatevoidReceiveDataFromClient(TcpClienttcpClient){varreadBuffer=newbyte[2048];varpacketProtocol=newPacketProtocol(2048);packetProtocol.MessageArrived+=_messageArrived;使用(tcpClient)使用(varnetworkStream=tcpClient.GetStream()){intreadSize;while((readSize=networkStream.Read(readBuffer,0,readBuffer.Length))!=0){packetProtocol.DataReceived(readBuffer,readSize);}}}publicvoidClose(){_tcpClient.Close();_task.Wait();我也有异步问题,这些是我的发现:https://stackoverflow.com/a/22222578/307976另外,我有一个使用异步服务器/客户端的异步TCP示例,扩展性很好尝试使用ReceiveInt32Async和ReceiveDataAsync的以下实现来直接接收长度前缀的消息,而不是tcpClient.GetStream和networkStream.ReadAsync:Int32)];等待tcpClient.ReceiveDataAsync(数据).ConfigureAwait(假);返回BitConverter.ToInt32(数据,0);}staticpublicTaskReceiveDataAsync(thisTcpClienttcpClient,byte[]buffer){returnTask.Factory.FromAsync((asyncCallback,state)=>tcpClient.Client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,asyncCallback,state),(asyncResult)=>tcpClient.Client.EndReceive(asyncResult),null);}}看看这是否有所改善。此外,我建议将ReceiveDataFromClientAsync设为异步任务方法并将其返回的任务存储在AsyncTcpClientConnection中(用于状态和错误跟踪)。以上是C#学习教程:async/await会影响tcpserver的性能吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
