我有一个要在blockingFoo()
上下文中使用的阻塞调用async
。我想在另一个线程上运行它,以免阻塞async
。
这是我的解决方法:
let asyncFoo =
async {
blockingFoo() |> ignore
}
|> Async.StartAsTask
|> Async.AwaitTask
这是执行此操作的正确方法吗?
这项工作会按预期进行吗?
答案 0 :(得分:5)
我认为您有点迷路了。 Async.StartAsTask
后跟Async.AwaitTask
有效地互相抵消,其副作用是在进程中创建的Task
实际上触发了线程池上包含blockingFoo
的异步块的评估。这样行之有效,但以某种方式超出了期望。
如果您想从另一个异步块中触发对asyncFoo
的评估,一种更自然的方法是,如果您不想等待其完成,请使用Async.Start
,或者{ {1}}(如果这样做)。
Async.StartChild