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