【发布时间】:2014-07-13 17:00:52
【问题描述】:
用 F# async 进行一些实验告诉我,我可以在 当前正在运行的线程上 StartImmediate。这似乎允许我运行一个异步表达式,它仍然可以传递控制,无论何时进入它内部进行一些异步操作(例如,做!),到异步表达式之外的代码。请看下面的简单示例:
open System.Threading
let workThenWait() = async {
printfn "async start"
do! Async.Sleep(1000)
printfn "async end"
}
let demo() =
workThenWait() |> Async.StartImmediate
printfn "main started"
// here I want to wait to the async expression in case it has passed control
printfn "main end"
demo()
我们得到的结果是:
async start
main started
main end
async end
另一方面,如果我使用 StartAsTask(在演示中)执行相同的异步表达式(在本例中为 workThenWait),我可能会在结尾。
我的问题是:
使用前面使用 StartImmediate 的示例,我是否可以在同一个线程上运行,但也可以在结束时等待异步表达式,以防调用某些异步操作(例如 do!)并向前传递控制权?
【问题讨论】: