C# 100 % de temps CPU avec un TCPListener

C# 100 % de temps CPU avec un TCPListener - C#/.NET managed - Programmation

Marsh Posté le 19-08-2004 à 09:49:04    

Salut
 
J'ai écrit un petit serveur Web en C# avec une fonction ecoute pour traiter les demande de connection par les clients :
 

Code :
  1. public void ecoute(){
  2.   IPAddress locale = IPAddress.Parse("127.0.0.1" );
  3.   TcpListener listener = new TcpListener(locale,port);
  4.   listener.Start();
  5.   _running = true;
  6.   while(_running){
  7.     try{
  8.      if(listener.Pending()) {
  9.        TcpClient connection = listener.AcceptTcpClient();
  10.        try{
  11.         service(connection);
  12.        }catch(Exception ex){
  13.         intf.ecrireLog("Erreur de service "  + ex.Message);
  14.        }
  15.      connection.Close();
  16.      }
  17.     }catch(Exception ex){
  18.      _running = false;
  19.     }
  20.   }
  21. }


 
La méthode ecoute est lancée dans un Thread à l'intérieur de l'objet serveur :
 

Code :
  1. Thread tService = new Thread(new ThreadStart(ecoute));
  2. tService.start();


 
Tout fonctionne...à part le fait que dés que je lance tService.start(), j'ai pratiquement 100% de temps CPU pris par l'appli, que je sois en Windows.Form ou en console, et quelle que soit la priorité du thread tService (normal, lowest..)  :heink:  
 
Quelqu'un pourrait m'aider ?  :cry:

Reply

Marsh Posté le 19-08-2004 à 09:49:04   

Reply

Marsh Posté le 20-08-2004 à 00:51:56    

j'ai pas encore testé C# en réseau, je me suis pas encore penché sur l'API. si ça se trouve y a une .Méthode pour faire ça, dans le cas contraire, insère toi même un temporisation à chaque itération de boucle.
 
Par exemple, je ferais un
 
if(listener.Pending())
{ /* action */ }
else
{ Thread.Sleep( 100 ); }
 
 
edit : d'ailleurs quand j'y pense, il doit y avoir un truc avec des AsynCallBack pas très loin
 
 
sinon tu peux faire en bloquant, avec .AcceptTCPClient() et .AcceptSocket()


Message édité par Taz le 20-08-2004 à 00:55:54
Reply

Marsh Posté le 20-08-2004 à 10:56:29    

Oui c'est ça, je croyais que listener.Pending() était une méthode synchronisée bloquante, comme listener.AcceptTcpClient(), et en fait non, résultat des courses, j'avais une magnifique boucle infinie avec listener.Pending() qui me renvoyait true et un beau while(true) au dessus.
 
J'ai enlevé la conditionnelle sur le pending et tout est OK.
 
Merci à toi en tout cas :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed