f# - 在 F# 中使用 WriteLineAsync

标签 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:流写入器当前正在被先前的写入操作使用。

我做错了什么?

最佳答案

全部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
}

关于f# - 在 F# 中使用 WriteLineAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116231/

相关文章:

.net - 没有警告错误的沮丧工会案例

F# 查询串联

c# - 我可以使用 async/await 来模拟后台 worker 吗?

javascript - 使用内部异步函数的异步测试应该失败

javascript - 使用 forEach 和 async/await,对于 Node 和 Jest 的行为不同

c# - 当异步函数被同步调用时,被调用者的线程会发生什么

f# - 为什么使用基本关键字会导致此错误?

.net - "Chaining"F# 中的异步函数

f# - F# 中非常简单的循环

node.js - 定义异步函数时的 async/await Node v9 "unexpected token function"