Wraz z wprowadzeniem async/Oczekujcie, tak długo, jak wszystkie oprócz jednego z twoich zadań czytania są asynchroniczne, powinieneś być w stanie przetworzyć te same dane dwa razy używając tylko jednego wątku systemu operacyjnego.
Co myślę, że chcesz, to połączona lista bloków danych, które widziałeś do tej pory. Następnie możesz mieć wiele niestandardowych instancji Stream, które trzymają wskaźnik na tej liście. Gdy bloki wypadną z końca listy, będą zbierane śmieci. Ponowne użycie pamięci wymagałoby innego rodzaju okrągłej listy i liczenia odwołań. Naprawalne, ale bardziej skomplikowane.
Kiedy niestandardowy strumień może odpowiedzieć na wywołanie ReadAsync z pamięci podręcznej, skopiuj dane, przesuń wskaźnik w dół listy i wróć.
Kiedy Twój strumień zostanie przechwycony na końcu listy pamięci podręcznej, chcesz wydać pojedynczą ReadAsync do strumienia bazowego, nie czekając na niego, i buforować zwrócone zadanie z blokiem danych. Więc jeśli inny czytnik strumienia również się zapisze i spróbuje przeczytać więcej zanim ten odczyt się zakończy, możesz zwrócić ten sam obiekt zadania.
W ten sposób obaj czytelnicy oczekują kontynuacji na wynik tego samego wywołania ReadAsync. Kiedy pojedynczy odczyt zostanie zwrócony, oba zadania czytania będą sekwencyjnie wykonywać następny krok w ich procesie.
Coś 'tee' w UNIX ... –
Prawdopodobnie muszą opierać się wokół okrągłego bufora. Spróbuję napisać szybką implementację, jeśli dostanę czas. – Noldorin