在异步上下文中读取文件?

sdg*_*sdh 3 io f# asynchronous

我想利用它async来使我的代码在F#中更具可读性和高性能.

我可以用这样的函数读取整个文件:

let readFile path = async {
  return System.IO.File.ReadAllText path
}
Run Code Online (Sandbox Code Playgroud)

然后使用这样的函数:

"README.md" |> readFile |> Async.RunSynchronously |> Console.WriteLine
Run Code Online (Sandbox Code Playgroud)

但是,.NET ReadAllText方法是阻塞的.

这是使用读取文件的合适方法async吗?

Tom*_*cek 7

您可以使用StreamReader公开异步版本的类ReadToEnd.

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

实际上,在这种情况下运行一些测量以确保实际上从使用异步获得一些好处可能是一个好主意 - 除非你对许多文件做了一些有趣的事情,否则可能并不重要.