Асинхронно многократно чтение из потока? - PullRequest
1 голос
/ 19 октября 2011

Как я могу структурировать следующий код так, чтобы я мог читать весь поток кусками. В настоящее время он продолжает возвращать те же данные. Невозможно продвинуться.

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);
}

1 Ответ

1 голос
/ 20 октября 2011

Попал в ту же ловушку. Асинхронные потоки ведут себя как воспроизводимые. Хотя он содержит только один элемент. Чтобы это исправить, оберните его в Defer вот так

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