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).aspx

    Du 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.


Anmelden zum Antworten