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

问题描述 投票:-1回答:1
             let CreateEventSourcingConnection() =
             task {
                 let connection =
                     let ipEndPoint = IPEndPoint(IPAddress.Loopback, 1113)
                     EventStoreConnection.Create(ipEndlPoint)
                 do! connection.ConnectAsync()
                 return connection
             }

对于任务我得到:

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

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

f#
1个回答
3
投票

我假设问题在Logary的上下文中,后者从task NuGet包(从TaskBuilder.fs中可以看到)获取Paket references计算构建器。 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代码可能会有些困难!

© www.soinside.com 2019 - 2024. All rights reserved.