Чтение файла в асинхронном контексте? - PullRequest
0 голосов
/ 03 июня 2018

Я хотел бы использовать async, чтобы сделать мой код более читабельным и производительным в F #.

Я могу прочитать весь файл с помощью функции, подобной этой:

let readFile path = async {
  return System.IO.File.ReadAllText path
}

, а затем использовать функцию следующим образом:

"README.md" |> readFile |> Async.RunSynchronously |> Console.WriteLine

Однако .NET ReadAllText метод блокирующий.

Это подходящий способ чтения файлов с использованием async?

1 Ответ

0 голосов
/ 04 июня 2018

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

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

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


Бонус:

let writeFile (path : string) (content : string) = async {
  use sw = new System.IO.StreamWriter(path)
  return!
    sw.WriteAsync(content)
    |> Async.AwaitTask
}
...