2012-11-29 4 views
2

J'ai un IInputStream que je veux lire des données jusqu'à ce que je rencontre un certain octet, à quel point je vais passer le IInputStream à un autre objet à consommer le reste du flux.WinRT - Lire à partir de IInputStream un octet à la fois jusqu'à un octet spécifique rencontré

C'est ce que je suis venu avec:

public async Task HandleInputStream(IInputStream instream) 
{ 
    using (var dataReader = new DataReader(instream)) 
    { 
     byte b; 
     do 
     { 
      await dataReader.LoadAsync(1); 
      b = dataReader.ReadByte(); 

      // Do something with the byte 
     } while (b != <some condition>); 

     dataReader.DetachStream(); 
    } 
} 

Il semble comme la course LoadData pour un octet à la fois sera horriblement lent. Mon dilemme est que si je choisis une taille de tampon (comme 1024) et que je la charge, et que ma valeur affiche 10 octets, alors cette méthode aura les 1014 octets de données suivants et devra passer à la méthode suivante pour le traitement .

Existe-t-il une meilleure façon d'aborder cette question ou s'agit-il d'une solution acceptable?

Répondre

2

Si la valeur que vous recherchez n'est pas trop éloignée du début du flux, ce type de lecture ne devrait pas être trop lent. À quelle distance du ruisseau l'attendez-vous? Avez-vous testé la performance?

En fonction du type de flux que vous utilisez, vous pourriez être en mesure d'utiliser d'autres approches:

  • Si elle prend en charge la recherche vers l'arrière (par exemple, vous lisez à partir d'un fichier), vous pouvez lire chuncks plus grandes à la fois tant que vous savez à quel offset vous avez trouvé votre valeur. Vous pouvez ensuite chercher dans le flux à cette position avant de le remettre.
  • Si ce n'est pas possible, vous pouvez créer un autre flux de mémoire intermédiaire dans lequel vous copiez la partie restante du tampon que vous avez déjà lu, suivie par le reste du flux. Cela fonctionne même si vous ne pouvez pas chercher en arrière. Le seul problème pourrait être la consommation de mémoire si le flux est trop grand.
+0

Je n'ai pas encore testé la performance. Cela ne devrait pas dépasser quelques centaines d'octets - donc je pense que ça marchera aussi. Il a juste soulevé un drapeau rouge avec moi quand je l'ai écrit. –

+0

Le flux provient d'une socket donc vous ne pouvez pas vraiment le chercher. –

+0

J'ai fait quelques tests et cela semble fonctionner correctement. Je vais utiliser cette méthode pour l'instant. Merci pour le deuxième avis! –

Questions connexes