在F#中使用WriteLineAsync

时间:2016-03-20 16:17:58

标签: f# async-await

我正在学习F#,我在使用WriteLineAsync方面遇到了问题。

使用同步代码可以完美运行:

using (new StreamWriter(new FileStream(@"c:\work\f2.txt",  FileMode.Create, FileAccess.Write, FileShare.None, bufferSize= 4096, useAsync= true)))
(fun sw -> File.ReadLines @"c:\Work\f1.txt" |> Seq.iter(fun x-> sw.WriteLine(x) ))

当我尝试使用WriteLineAsync时:

using (new StreamWriter(new FileStream(@"c:\work\f2.txt",  FileMode.Create, FileAccess.Write, FileShare.None, bufferSize= 4096, useAsync= true)))
    (fun sw -> File.ReadLines @"c:\Work\f1.txt" |> Seq.iter(fun x-> sw.WriteLineAsync(x) |>  Async.AwaitTask |>  ignore ))

我收到错误InvalidOperationException:前一个写操作当前正在使用流编写器。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

所有AwaitTask所做的就是它从Task<T>转换为Async<T>,实际上并没有等待任何事情。这意味着你不能仅仅ignore结果。

您可以使用async创建WriteLineAsync()工作流并等待do!

async {
    use sw = new StreamWriter(new FileStream(@"c:\work\f2.txt",  FileMode.Create, FileAccess.Write, FileShare.None, bufferSize= 4096, useAsync= true))
    for line in File.ReadLines @"c:\Work\f1.txt" do
        do! sw.WriteLineAsync(line) |>  Async.AwaitTask
}