2011-10-19 2 views
1

Comment puis-je structurer le code suivant afin que je puisse lire tout le flux en morceaux. Actuellement, il continue de renvoyer les mêmes données. Je ne peux pas avancer.Lecture asynchrone répétée d'un flux?

public static IObservable<byte[]> AsyncRead(this Stream stream, int bufferSize) 
{ 
    var asyncRead = Observable.FromAsyncPattern<byte[], int, int, int>(stream.BeginRead, stream.EndRead); 

    var buffer = new byte[bufferSize]; 

    return asyncRead(buffer, 0, bufferSize) 
     .Select(cbRead => 
        { 
         var dataChunk = new byte[cbRead]; 

         Buffer.BlockCopy(buffer, 0, dataChunk, 0, cbRead); 

         return dataChunk; 
        }) 
     .Repeat() 
     .TakeWhile(dataChunk => dataChunk.Length > 0); 
} 

Répondre

1

De même dans le même piège. Les flux asynchrones se comportent comme un rejouable. Bien qu'il ne contienne que cet élément. Pour corriger cela, enveloppez-le dans Defer comme ceci

Observable.Defer(() => asyncRead(buffer, 0, bufferSize)) 
...