TcpClient.GetStream().DataAvailable retourne false, mais stream a plus de données

Donc, il semblerait qu'un blocage de la Lecture() peut retourner avant qu'il se fait de recevoir toutes les données qui lui sont envoyées. Nous envelopper le Lire() avec une boucle qui est contrôlé par la valeur DataAvailable à partir du flux en question. Le problème, c'est que vous pouvez recevoir plus de données, tandis que dans cette boucle, mais il n'y a pas de derrière les coulisses de traitement de passe pour laisser le système le savoir. La plupart des solutions que j'ai trouvé ça sur le net n'ont pas été d'une façon ou d'une autre pour moi.

Ce que j'ai fini par faire, c'est comme la dernière étape dans ma boucle, je fais un simple Fil.Sleep(1) après la lecture de chaque pâté de maisons de la rivière. Cela semble donner au système le temps de mettre à jour et je ne suis pas d'obtenir des résultats précis, mais cela semble un peu hacky et tout à fait un peu "circonstancielle" pour une solution.

Voici une liste de ces circonstances, je fais affaire avec: une Seule Connexion TCP entre une Application IIS et une application autonome, tant à l'écrit en C# pour envoyer/recevoir des communications. Il envoie une requête et attend une réponse. Cette demande est initiée par une requête HTTP, mais je ne suis pas avoir ce problème de la lecture des données de la Requête HTTP, il est après le fait.

Voici le code de base pour la manipulation d'une connexion entrante

protected void OnClientCommunication(TcpClient oClient)
{
    NetworkStream stream = oClient.GetStream();
    MemoryStream msIn = new MemoryStream();

    byte[] aMessage = new byte[4096];
    int iBytesRead = 0;

    while ( stream.DataAvailable )
    {
        int iRead = stream.Read(aMessage, 0, aMessage.Length);
        iBytesRead += iRead;
        msIn.Write(aMessage, 0, iRead);
        Thread.Sleep(1);
    }
    MemoryStream msOut = new MemoryStream();

    //.. Do some processing adding data to the msOut stream

    msOut.WriteTo(stream);
    stream.Flush();

    oClient.Close();
}

Tous les commentaires de bienvenue pour une meilleure solution ou juste un coup de pouce sur le besoin de donner que de Sommeil(1) allez à laisser les choses se mettre à jour correctement avant de nous vérifions la valeur DataAvailable.

Suppose que je suis l'espoir au bout de 2 ans que la réponse à cette question n'est pas la façon dont les choses sont encore 🙂

Qu'avez-vous en fin de mise en œuvre? Avez-vous de coller avec le fil de sommeil? J'ai un problème similaire: stackoverflow.com/questions/36731247/...
Oui, c'est juste la façon dont ces bibliothèques travail. Ils ont besoin d'avoir de temps à s'exécuter pour valider entièrement les données entrantes.

OriginalL'auteur James | 2010-11-23