Прежде всего, документация для EndRead NOT явно говорит о том, что асинхронная операция чтения, инициированная BeginRead, является атомарной или непрерывной.
Вопрос
Можно ли прервать операцию асинхронного чтения, начатую FileStream.BeginRead, чтобы она заканчивалась до заполнения буфера, возвращая количество байтов, считанных в буфер на данный момент, или это операция "все или ничего"?
Другими словами, есть ли такой метод, как «Cancel_IO», который я могу вызвать, чтобы при вызове EndRead вместо ожидания считывания всех возможных байтов он возвращался раньше в результате отмены чтения
Фон
Я прочитал документацию по FileStream, BeginRead и EndRead. EndRead не имеет никаких перегрузок, способных вызвать преждевременное завершение операции, возвращая частично полный буфер. Меня интересует, может ли кто-нибудь подтвердить или опровергнуть существование метода в API операционной системы Windows (Win32) или, возможно, API-интерфейса драйвера диска, который может привести к преждевременному завершению операции, инициированной FileStream.BeginRead, когда EndRead называется. Под «ранним» я подразумеваю перед заполнением всю запрашиваемую длину буфера без ошибки.
Вариант использования
Ради лишнего воображения предположим, что файл находится в общем сетевом ресурсе, и сеть может иногда испытывать крайние замедления, такие, что запуск на раннем этапе завершения операции буферизации 1 МБ будет практичным и оптимальным, чтобы получить несколько байтов для обработки перед возобновлением новой операции буферизации 1 МБ.
Эти "несколько байтов" могут быть использованы для инициирования создания ряда вычислительно-ресурсоемких ресурсов в памяти, которые могут быть созданы, пока разрешается завершить буферизацию.
О документации
Обратите внимание, что в документации BeginRead прямо не указывается, что асинхронная операция является атомарной или является непрерывной. Все, что упоминается, - это то, что если произойдет «ошибка», вы не узнаете об этом, пока не будет вызван EndRead. Это не исключает возможности возникновения какого-либо другого события, не являющегося ошибкой, которое заставило бы EndRead возвращать некоторое количество байтов меньше запрошенного числа, что в любом случае происходит все время.
Например, «конец файла» и «заполнение буфера» могут рассматриваться как два «естественных» прерывания асинхронной операции чтения, которые приводят к тому, что она возвращает без количества запрошенных байтов без ошибок. Я ищу "искусственные" возможности прерывания, которые также заставили бы EndRead успешно возвращать число байтов, считанных в буфер, до EOF и до того, как буфер заполнен.