Con la introducción de asíncrono/esperan, siempre y cuando todas las tareas de lectura, salvo una, son asincrónicas, debe poder procesar los mismos datos dos veces con solo un hilo del sistema operativo.
Lo que creo que quiere, es una lista vinculada de los bloques de datos que ha visto hasta ahora. Luego puede tener múltiples instancias Stream personalizadas que contengan un puntero en esta lista. A medida que los bloques caen al final de la lista, serán recolectados como basura. Reutilizar la memoria inmediatamente requeriría algún otro tipo de lista circular y recuento de referencias. Factible, pero más complicado.
Cuando su Stream personalizado puede responder una llamada de Lectura rápida desde el caché, copie los datos, avance el puntero hacia abajo en la lista y vuelva.
Cuando su Stream ha alcanzado el final de la lista de caché, desea emitir una sola ReadAsync a la secuencia subyacente, sin esperarla, y almacenar en caché la tarea devuelta con el bloque de datos. Entonces, si cualquier otro lector de Stream también se da cuenta y trata de leer más antes de que se complete esta lectura, puede devolver el mismo objeto de Tarea.
De esta manera, ambos lectores engancharán su continuación al resultado de la misma llamada de ReadAsync. Cuando regresa la lectura única, ambas tareas de lectura ejecutarán secuencialmente el siguiente paso de su proceso.
algo como 'tee' en UNIX ... –
Es probable que tenga que ser en torno a un buffer circular. Trataré de escribir una implementación rápida si tengo tiempo. – Noldorin