2010-07-21 4 views
1

Je reçois un rappel de réception d'une méthode client asynchrone qui est censée appeler socket.BeginReceive en interne pour vérifier si les données sont en cours d'envoi. Le code est le suivant:Async Socket.BeginReceive Mystère d'appel interne

private void ReceiveCallback(IAsyncResult ar) 
    { 
     try 
     { 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket client = state.workSocket; 
      int bytesRead = client.EndReceive(ar); 

      if (bytesRead > 0) 
      { 
       state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 
       client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
        new AsyncCallback(ReceiveCallback), state); 
      } 
      else 
      { 
       if (state.sb.Length > 1) 
       { 
        response = state.sb.ToString(); 
       } 
       File.AppendAllText(DataDisplay.Properties.Settings.Default.rawDataLog, response + "\r\n"); 
       receiveDone.Set(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
     } 

Le problème est que lorsque le code atteint l'appel client.BeginReceive, rien ne se passe. Je sais que cela semble vague, alors laissez-moi essayer d'expliquer. J'ai défini des points d'inflexion dans le code pour voir où cela pourrait aller, et je ne peux pas le comprendre. J'ai essayé le cas else, le début du ReceiveCallback, où le receivedone.Set() revient à dans le code principal, la déclaration catch, etc. en vain.

La partie qui prête le plus à confusion est que lorsque je l'exécute avec un serveur de test que j'ai écrit, cela fonctionne comme je l'attendais. Ce code provient essentiellement de l'exemple MSDN sur les sockets asynchrones, au cas où il semble familier. Ce n'est que lorsque je l'essaie avec le périphérique tiers, je suis coincé.

Des idées sur ce qui pourrait se passer ici?

Répondre

1

Est-il possible que pendant que vous déboguez, rien ne soit réellement reçu de sorte qu'il attende essentiellement de façon permanente sur le thread de réception? Notez que BeginReceive utilisera un thread ThreadPool et rappellera la méthode que vous publiez. Si ce n'est pas rappeler, alors ma première impression est que ce n'est rien reçu.

+0

Lorsque je sonde l'objet StateObject, il a reçu une chaîne de données et l'a stockée, et le code arrive au point où il tente d'appeler client.BeginReceive à nouveau. Ne devrait pas au moins ré-entrer dans le ReceiveCallback, même s'il n'y a plus rien d'autre, ou suis-je confus? – CaffeineZombie

+0

Si aucun délai d'attente n'est spécifié, le système attendra. Vous n'êtes pas sûr de l'implémentation sous-jacente. –

+0

Je vous conseille de consulter la documentation sur la façon d'utiliser la méthode: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx –