2013-03-02 6 views
1

Fond
Je construis une application C# à distance pour me connecter via un serveur php. Il vérifie si le programme client est reconnu par le serveur puis boucle pour envoyer des journaux tels que l'heure en ligne et vérifie les commandes. J'ai vaguement commenté certaines parties que vous ne pouvez pas comprendre pourquoi je les ai faites.WebClient est bloqué?

namespace Revamped_SERVER 
    { 
     class Program 
     { 
      static readonly String BASEURL = "http://mysite.com/index.php?"; 
      static String OLD_ID = default(String); 
      static String CURRENT_ID = default(String); 
      static string GET(string PHP,Boolean IS_COMMAND) 
      { 
       using (WebClient CLIENT = new WebClient()) 
       { 
        string RAW = CLIENT.DownloadString(BASEURL + PHP); 
        if (IS_COMMAND) 
        { 
//this is a command, I remove the unique command ID so that previous commands and new ones aren't repeated if they have been submited more than once 
         CURRENT_ID = RAW.Remove(5, RAW.Length - 5); 
         return RAW.Remove(RAW.Length - 154, 154).Replace(CURRENT_ID, ""); 
        } 
        else { return RAW.Remove(RAW.Length - 154, 154); } //this part removes extra string from server analytics a pain in the ***. 
       } 
      } 
      static string TIMESTAMP() 
      { 
       return DateTime.Now.ToString("M/d/yyy") + " - " + DateTime.Now.ToString("HH:mm:ss tt"); //Time to send to server 
      } 
      static void Main(string[] args) 
      { 
       using (WebClient CLIENT = new WebClient()) 
       { 
        Boolean CONNECTED = false; 
        String Username = Environment.UserName; 
        while (true) 
        { 
         while (CONNECTED == false) 
         { 
          if (GET("REQUEST=ONLINE",false) == "TRUE") 
          { 
           CONNECTED = true; 
          } 
         } 
         if (CONNECTED) 
         { 
          if (GET("REQUEST=CHECK",false) == "FALSE") 
          { 
           CLIENT.OpenRead(BASEURL + "REQUEST=ADD"); 
          } 
          CLIENT.OpenRead(BASEURL + "DATA=" + Username + "\r\nLast online at " + TIMESTAMP()); 
          try 
          { 
//this is where it gets stuck 

           String COMMAND = GET("REQUEST=COMMAND",true); 
           if (CURRENT_ID != OLD_ID) 
           { 
            OLD_ID = CURRENT_ID; //Set new ID 
            MessageBox.Show(COMMAND); //Show what Commands was sent by server 
           } 
          } 
          catch 
          { 
           CONNECTED = false; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 


Problème
Sur la première boucle, il fonctionne parfaitement bien: Connects, vérifie s'il est reconnu par le serveur et vérifie ensuite les commandes. Cependant, comme il boucle à nouveau, il envoie les journaux, mais reste bloqué à:

String COMMAND = GET("REQUEST=COMMAND",true); 

Il me donne pas d'erreur, mais quand je passe la souris ma souris du client web, il me donne ceci:

Cannot evaluate expression because the code of the current method is optimized.

J'ai regardé ces articles mais cela ne m'explique pas comment je peux éviter cela dans mon cas.

http://blogs.msdn.com/b/jmstall/archive/2005/11/15/funceval-rules.aspx

Quel est le problème avec ce WebClient étant bloqué sur sa deuxième boucle?


Détails

  • J'utilise .NET 4.5
  • Windows 7 64 bits
  • Visual Studios 2012
  • Server est en ligne et fonctionne parfaitement
+0

Il existe de nombreuses raisons pour lesquelles DownloadString peut prendre un certain temps. Vous pourriez être en mesure de voir de meilleures informations pendant le débogage si vous ne déployez pas de binaires de version. Remplacez temporairement les fichiers binaires par des fichiers binaires de débogage et réessayez. –

Répondre

1

WebClient.OpenRead renvoie un flux qui doit être transmis à un lecteur de flux pour lire la réponse.

Dans votre cas, vous n'utilisez pas le flux retourné. Puisque vous réutilisez l'instance de webclient, je suppose que c'est ce qui provoque le comportement que vous mentionnez.

+0

Ce n'est pas OpenRead c'est DownloadString. Je n'ai pas de réponse du serveur, donc il ne serait pas échanger des informations avec le client. –

+0

Je regardais les lignes 45 et 47. Peut-être que le flux actuel me manque. –