TCPListener verursacht bis 50% CPU Last
-
Hallo Leute,
sicher kennt sich einer von Euch hiermit aus.
Warum verbraucht mein TCPListener soviel CPU Last?
returnValue=String::Empty; IPAddress ^localIP=IPAddress::Parse(ipAddress); TcpListener ^listener=gcnew TcpListener(localIP, Convert::ToInt32(port)); listener->Start(); array<Byte>^readArray=gcnew array<Byte>(1000); while(threadAbort==false){ if(listener->Pending()==true){ TcpClient ^tcpClient=listener->AcceptTcpClient(); NetworkStream ^nStream=tcpClient->GetStream(); Int32 i; while(i=nStream->Read(readArray,0,readArray->Length)){ returnValue=System::Text::Encoding::ASCII->GetString(readArray,0,i); } nStream->Close(); tcpClient->Close(); } }
Hat jemand ne Idee?
-
Weil Du eine Schleife hast und nicht Ereignis-Orientiert arbeitest?
-
Hallo Jochen,
ok, aber was muss ich ändern?
-
Hier die Doku:
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.100).aspxDu kannst z.B. BeginAcceptTcpClient(..) und EndAcceptTcpClient(..) benutzen.
Simon
-
Ja, Ereignisse sind das Mittel der Wahl. Bis dahin, kannste mal kurz schummeln mit
returnValue=String::Empty; IPAddress ^localIP=IPAddress::Parse(ipAddress); TcpListener ^listener=gcnew TcpListener(localIP, Convert::ToInt32(port)); listener->Start(); array<Byte>^readArray=gcnew array<Byte>(1000); while(threadAbort==false){ if(listener->Pending()==true){ TcpClient ^tcpClient=listener->AcceptTcpClient(); NetworkStream ^nStream=tcpClient->GetStream(); Int32 i; while(i=nStream->Read(readArray,0,readArray->Length)){ returnValue=System::Text::Encoding::ASCII->GetString(readArray,0,i); } nStream->Close(); tcpClient->Close(); } else{ System::Threading::Thread::Sleep(100); } }
oder das if ganz weglassen. AcceptTcpClient wartet doch schon von alleine, oder?
Konsoleanwendung? Vielleicht würde ich lieber multithreading machen als mit Ereignissen zu hantieren.
-
volkard schrieb:
AcceptTcpClient wartet doch schon von alleine, oder?
Da sein Quelltextbeispiel direkt/indirekte aus der von theta verlinkten Doku stammt würde ich das auch vermuten dass es blockierend ist. Sein Problem müsste dann woanders liegen.
-
Hallo Leute,
so nun läuft es erstmal problemlos. Vielen Dank für die Tipps.
-
volkard schrieb:
Ja, Ereignisse sind das Mittel der Wahl. Bis dahin, kannste mal kurz schummeln mit
Würde ich nicht sagen, denn TcpListener bietet gar keine Ereignisse (im .NET Sinne) an.
volkard schrieb:
AcceptTcpClient wartet doch schon von alleine, oder?
Ja, tut es. Es ist blockierend.
volkard schrieb:
Vielleicht würde ich lieber multithreading machen als mit Ereignissen zu hantieren
Da würde ich den Ansatz mit dem APM (BeginXXX / EndXXX) benutzen und nicht selbst was mit Threads "basteln".
Simon
-
@theta:
Naja, die Asynchronen Funktionen (BeginXxx/EndXxx) richtig zu verwenden ist auch nicht ohne.
Mit Threads kann das schonmal einfacher sein.