F# 中的“任务”是什么?

voj*_*tak 2 f#

             let CreateEventSourcingConnection() =
             task {
                 let connection =
                     let ipEndPoint = IPEndPoint(IPAddress.Loopback, 1113)
                     EventStoreConnection.Create(ipEndlPoint)
                 do! connection.ConnectAsync()
                 return connection
             }
Run Code Online (Sandbox Code Playgroud)

对于任务我得到:

构造函数“task”的值未定义。

那么,这是什么以及如何定义它?

Tom*_*cek 5

我假设问题是在 Logary 的上下文中,它task从 NuGet 包获取计算构建器(正如我们从Paket 参考文献TaskBuilder.fs中看到的那样)。该项目可在此处获得,并附有一些文档TaskBuilder.fs

因此,task是一个代表计算构建器实例的变量TaskBuilder。这是一个F# 计算表达式,它允许您创建创建 .NETTask<T>类型作为结果的计算。在计算表达式中,您可以使用let!anddo!来实现与 C# 中相同的目的await,即等待某个异步操作完成(不阻塞线程):

task {
  do! Console.Out.WriteLineAsync("Enter a filename:")
  let! name = Console.In.ReadLineAsync()
  use file = File.CreateText(name)
  for i in Enumerable.Range(0, 100) do
    do! file.WriteLineAsync(String.Format("hello {0}", i))
  do! Console.Out.WriteLineAsync("Done")
  return name
}
Run Code Online (Sandbox Code Playgroud)

这里,WriteLineAsyncReadLineAsync是返回的 .NET 方法Task,我们可以使用它们,就好像它们只返回string或 一样unit

还值得补充的是,Logary 可能不是最容易研究的 F# 代码。它非常聪明和漂亮,但依赖于 HOPAC 并发库,该库需要相当多的背景知识并使用许多奇特的运算符,这可能使代码很难理解。因此,如果您对 F# 比较陌生,那么理解 HOPAC 代码可能会有点困难!