I would like to leverage async to make my code more readable and performant in F#. 
I can read an entire file with a function like this:
let readFile path = async {
  return System.IO.File.ReadAllText path
}
And then use the function like this:
"README.md" |> readFile |> Async.RunSynchronously |> Console.WriteLine
However, the .NET ReadAllText method is blocking. 
Is this an appropriate way to read files using async? 
You can use the StreamReader class which exposes an asynchronous version of ReadToEnd. 
let readFile (path:string) = async {
  use sr = new StreamReader(path)
  return! sr.ReadToEndAsync() |> Async.AwaitTask
}
In practice, it is probably a good idea to run some measurements to make sure that you are actually getting some benefits from using async in this scenario - unless you are doing something interesting with many files, it might not matter much.
Bonus:
let writeFile (path : string) (content : string) = async {
  use sw = new System.IO.StreamWriter(path)
  return!
    sw.WriteAsync(content)
    |> Async.AwaitTask
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With