我最近一直在使用FSharpx 库,尤其是它的TaskBuilder进行编程。现在我想知道是否应该可以定义一个接受参数并接受结果的函数。如
let doTask(parameter:int) =
let task = TaskBuilder(scheduler = TaskScheduler.Current)
task {
return! Task.Factory.StartNew(fun() -> parameter + 1)
}
match FSharpx.Task.run doTask(1) with
| _ -> ()
查看源代码,我看到run需要一个不带参数并返回Task<'a>
. FSharpx TaskTests上似乎也没有示例。
如果有人能建议我应该如何使用 FSharpx 获得这样的场景,或者由于我目前还没有完全理解的原因不应该使用这样的库,我将不胜感激。
<编辑:我相信我可以将 doTask 包装如下
wrapperDoTask() = doTask(101)
match FSharpx.Task.run wrapperDoTask with
| _ -> ()
它可能会起作用。我目前没有使用编译器,所以这有点麻烦。有没有人对任何方向有意见,或者我只是回答了我自己的问题?:)
<edit2:
我想我需要根据MisterMetaphor 的回答再编辑一次。我认为,尤其是他的P.S.
消息灵通。我使用 FSharpx TaskBuilder 与 C# 进行互操作,其中,如前所述,任务返回为hot(有一些小例外),已经在运行。这与我最近的问题将 async-await C# 代码翻译成 F# 与调度程序和奥尔良有关(我将添加一些标签来加强上下文,也许其他人也在考虑这些)。
当用 C# 术语思考时,我试图实现的是在返回之前等待任务结果,但不会阻塞。我所追求的行为尤其是await
not .Result
。例如,可以从
试图用 C# 来思考哪个上下文、调度程序或行为或正在发生的事情对我来说有点模糊。不幸的是,在互操作方面,我似乎无法忽略所有细节。:)