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

时间:2018-06-03 18:29:53

标签: asynchronous io f#

我想利用;使我的代码在F#中更具可读性和高性能。

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

?-worstGrades(Name,Grade).
Name=Bob,Grade=3;
Name=Max,Grade=5;
Name=Pete,Grade=5; 
....

然后使用这样的函数:

show(Name,Grade)

但是,.NET async方法正在阻止。

这是使用let readFile path = async { return System.IO.File.ReadAllText path } 读取文件的合适方式吗?

1 个答案:

答案 0 :(得分:7)

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

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

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

加成:

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