Чтение файла в асинхронном контексте?

sdgfsdh спросил: 10 мая 2018 в 04:49 в: asynchronous
Я хотел бы использовать async, чтобы сделать мой код более читабельным и эффективным в F #. Я могу прочитать целый файл с такой функцией:
 let readFile path = async {
  return System.IO.File.ReadAllText path
}

И затем используйте следующую функцию:
 "README.md" |> readFile |> Async.RunSynchronously |> Console.WriteLine
Однако метод .NET ReadAllText блокирует. Является ли это подходящим способом для чтения файлов с помощью async?Р>

1 ответ

Есть решение
Tomas Petricek ответил: 11 мая 2018 в 09:49

Вы можете использовать класс StreamReader, который предоставляет асинхронную версию ReadToEnd.

let readFile (path:string) = async {
  use sr = new StreamReader(path)
  return! sr.ReadToEndAsync() |> Async.AwaitTask
}

На практике это, вероятно, хорошая идея выполнить некоторые измерения, чтобы убедиться, что вы действительно получаете некоторые преимущества от использования async в этом сценарии - если вы не делаете что-то интересное со многими файлами, это может не иметь большого значения.

sdgfsdh ответил: 11 мая 2018 в 06:53
StreamReader есть IDisposable, а должен ли он use вместо let?
Tomas Petricek ответил: 11 мая 2018 в 09:49
@sdgfsdh Вы правы, спасибо! Я исправил это в ответе.

Дополнительное видео по вопросу: Чтение файла в асинхронном контексте?

Уроки Java для профессионалов | #4 - Запись и чтение данных из файлов (Java io)

Работа с файлами с++. Запись в файл. c++ ofstream. Изучение С++ для начинающих. Урок #115

Pascal. Ввод-вывод. Текстовые файлы