Еще одна вещь, которая может быть полезна, - это класс FileStream, имеющий свойство ReadTimeOut, которое определяется как:
Получает или задает значение в миллисекундах, которое определяет, как долго поток будет пытаться прочитать до истечения времени ожидания. (унаследовано от Stream)
Это может быть полезно в том смысле, что когда ваши чтения догоняют ваши записи, поток, выполняющий чтения, может приостановиться, пока буфер записи очищается. Конечно, стоило бы написать небольшой тест, чтобы выяснить, поможет ли это свойство вашему делу.
Операции чтения и записи происходят на одном и том же объекте? Если это так, вы можете записать свои собственные абстракции в файл, а затем написать код связи между потоками, чтобы поток, выполняющий запись, и уведомить поток, выполняющий чтение, когда это будет сделано, чтобы поток, выполняющий чтение, знал, когда прекратить чтение когда он достигнет EOF.