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

时间:2019-12-05 12:25:24

标签: f#

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

对于任务我得到:

  

未定义构造函数'task'的值。

那么,这是什么,我怎么定义它?

1 个答案:

答案 0 :(得分:3)

我假设问题在Logary的上下文中,后者从task NuGet包(如我们从Paket references可以看到)中获得了TaskBuilder.fs计算构建器。 TaskBuilder.fs项目is available here with some documentation

因此,task是代表TaskBuilder计算构建器实例的变量。这是F# computation expression,可让您创建计算,以创建.NET Task<T>类型作为结果。在计算表达式中,可以将let!do!用于与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
}

在这里,WriteLineAsyncReadLineAsync是返回Task的.NET方法,我们可以像使用它们一样返回stringunit

值得补充的是,Logary可能不是最容易研究的F#代码。它非常聪明和不错,但是依赖于HOPAC并发库,该库需要相当多的背景知识并使用许多特殊的运算符,这会使代码难以理解。因此,如果您是F#的新手,那么了解HOPAC代码可能会有些困难!