在我的f#项目中,我正在调用一个c#库,该库向我返回了一个Task。当我尝试在f#项目中执行此操作时,什么也没发生。
let str = getName() |> Async.AwaitTask |> Async.RunSynchronously
但是,如果我更新代码以使用异步工作流,它将不再挂起。调用Async.RunSynchronously时我怎么了?
async {
let! str = getName() |> Async.AwaitTask
//Do something with str
}
答案 0 :(得分:2)
在第二个示例中,您只是构建 async
工作流程,但不实际上运行该工作流程。
以这种方式设计,因此您可以定义复杂的工作流而不必立即运行它的每个异步部分,而可以在一切就绪并准备就绪时运行整个事情。
要运行它,您需要调用Async.RunSynchronously
或Async.StartAsTask
:
async {
let! str = getName() |> Async.AwaitTask
//Do something with str
} |> Async.RunSynchronously
此外,如果要做需要使用Task
,则最好使用TaskBuilder.fs而不是Async
。