Старый .Net способ выполнения асинхронного ввода-вывода для FileStream заключается в использовании FileStream.BeginRead() и FileStream.EndRead().
Документация MSDN для FileStream.BeginRead() гласит:
FileStream предоставляет два разных режима работы: синхронный ввод-вывод и асинхронный ввод-вывод. Хотя любой из них может быть использован, базовые ресурсы операционной системы могут позволить доступ только в одном из этих режимов.
По умолчанию FileStream синхронно открывает дескриптор операционной системы. В Windows это замедляет асинхронные методы. Если используются асинхронные методы, используйте конструктор FileStream (String, FileMode, FileAccess, FileShare, Int32, Boolean).
Способ .Net 4.5x для асинхронного ввода-вывода для FileStream заключается в использовании Stream.ReadAsync().
Документация MSDN для FileStream.ReadAsync() связана непосредственно с документацией для Stream.ReadAsync(). В этой документации нет необходимости открывать файл в режиме async; действительно, пример кода в документации явно не делает этого.
Поэтому я предполагаю, что при использовании File.ReadAsync() нет необходимости открывать файл в асинхронном режиме.
Правильно ли это предположение?
[EDIT]
Я только что обнаружил статью MSDN об использовании Async для доступа к файлам.
Это означает:
В примерах в этом разделе используется класс FileStream, который имеет параметр, который вызывает асинхронный ввод-вывод на уровне операционной системы. Используя эту опцию, во многих случаях можно избежать блокировки потока ThreadPool.
Чтобы включить эту опцию, вы указываете useAsync = true или options = FileOptions.Asynchronous аргумент в вызове конструктора.
Итак, теперь я думаю, что я должен открыть файл в асинхронном режиме... Если это так, то несколько неудачно, что пример кода, приведенный в документации для ReadAsync(), не открывает файл асинхронно!