为什么Async.RunSynchronously挂起?

时间:2018-09-07 20:42:40

标签: f#

在我的f#项目中,我正在调用一个c#库,该库向我返回了一个Task。当我尝试在f#项目中执行此操作时,什么也没发生。

let str = getName() |> Async.AwaitTask |> Async.RunSynchronously

但是,如果我更新代码以使用异步工作流,它将不再挂起。调用Async.RunSynchronously时我怎么了?

async {
     let! str = getName() |> Async.AwaitTask
     //Do something with str
}

1 个答案:

答案 0 :(得分:2)

在第二个示例中,您只是构建 async工作流程,但实际上运行该工作流程。

以这种方式设计,因此您可以定义复杂的工作流而不必立即运行它的每个异步部分,而可以在一切就绪并准备就绪时运行整个事情。

要运行它,您需要调用Async.RunSynchronouslyAsync.StartAsTask

async {
 let! str = getName() |> Async.AwaitTask
 //Do something with str
} |> Async.RunSynchronously

此外,如果要做需要使用Task,则最好使用TaskBuilder.fs而不是Async