TCP 클라이언트를 더 많이 받아들이고 연결된 모든 클라이언트로부터 지속적인 메시지를받는 tcp 서버 응용 프로그램이 있습니다.TCP 서버 응용 프로그램을 실행하는 동안 100 % CPU 사용량
public void KeepListening()
{
while (IsRunning)
{
try
{
Thread.Sleep(20);
if (tcpListener.Pending())
{
//Get the socket obtained from the tcpListener
TcpClient _Client = tcpListener.AcceptTcpClient();
NetworkStream ns = _Client.GetStream();
Thread.Sleep(20);
if (Stop_Status == false)
{
if (_Client.Connected)
{
int DataBytes = _Client.Available;
byte[] data = new byte[DataBytes];
if (ns.DataAvailable == true)
{
ns.Read(data, 0, DataBytes);
string Key = ASCIIEncoding.ASCII.GetString(data);
string[] KeyCodes = Key.Split(',');
if (Key != "" && ((KeyCodes[0].StartsWith("i"))))
ProcessClient(_Client, KeyCodes[0], Key);
}
}
}
else
{
ns.Flush();
}
}
}
catch
{
}
}
}
void ProcessClient(TcpClient _Client, string Key,string Msg)
{
try
{
if (hashTable_Users.Count > 0)
{
if (hashTable_Users.Contains(Key))
{
hashTable_Users.Remove(Key);
}
}
hashTable_Users.Add(Key, _Client);
hashusers = hashTable_Users.Count;
this.MessageFromClient(Key, serverPortNo.ToString(), Msg);
//StreamWriter sw = new StreamWriter(_Client.GetStream());
//sw.WriteLine("1");
//sw.Flush();
object[] objarr = new object[5];
objarr[0] = _Client;
objarr[1] = Key;
Thread ReceiveFromClient = new Thread(new ParameterizedThreadStart(ReceiveFromClients));
ReceiveFromClient.Start(objarr);
}
catch
{
}
}
public void ReceiveFromClients(object obj)
{
object[] objarr = (object[])obj;
TcpClient _Client = (TcpClient)objarr[0];
NetworkStream ns = _Client.GetStream();
while (IsRunning)
{
if (Stop_Status == false)
{
if (_Client.Connected)
{
if (ns.DataAvailable)
{
try
{
int numBytesRead = _Client.Available;
byte[] data = new byte[numBytesRead];
ns.Read(data, 0, numBytesRead);
string MsgReceived = ASCIIEncoding.ASCII.GetString(data);
string clientKey = objarr[1].ToString();
this.MessageFromClient(clientKey, serverPortNo.ToString(), MsgReceived);
}
catch
{
}
}
}
else
{
break;
}
}
else
{
ns.Flush();
}
}
}
KeepListening()
은 요청을 보내는 클라이언트를 받아들이는 데 사용됩니다. ProcessClient()
및 ReceiveFromClients()
은 클라이언트에서 메시지를 수신하는 데 사용됩니다.
이 응용 프로그램은 100 % cpu를 사용합니다.
CPU 사용을 줄이기 위해해야 할 일을 제안하십시오.
CPU 사용량을 줄이려면 프로파일 러를 사용하여 대부분의 CPU 리소스를 소비하는 코드 및 코드 줄을 찾습니다. 그런 다음 응용 프로그램을 재고하고 너무 많은 리소스를 사용하는 코드를 다시 작성하십시오. –
놀라지 않습니다. 작업주기 사이에 수면 스레드는 20ms 밖에 걸리지 않습니다. 나는 영원히 작동한다. –
적절한 비동기 TCP 서버를 작성하고 폴링하지 않아야합니다. BeginReceive 및 BeginAccept를 사용하십시오. – BlueM