let CreateEventSourcingConnection() =
task {
let connection =
let ipEndPoint = IPEndPoint(IPAddress.Loopback, 1113)
EventStoreConnection.Create(ipEndlPoint)
do! connection.ConnectAsync()
return connection
}
对于任务我得到:
未定义构造函数'task'的值。
那么,这是什么,我怎么定义它?
答案 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
}
在这里,WriteLineAsync
和ReadLineAsync
是返回Task
的.NET方法,我们可以像使用它们一样返回string
或unit
。
值得补充的是,Logary可能不是最容易研究的F#代码。它非常聪明和不错,但是依赖于HOPAC并发库,该库需要相当多的背景知识并使用许多特殊的运算符,这会使代码难以理解。因此,如果您是F#的新手,那么了解HOPAC代码可能会有些困难!