Async.StartImmediate会在当前线程上启动异步过程,但在过程的执行过程中可能会切换线程。以下是一个示例,说明Async.StartImmediate启动的异步过程可能在不同的线程上执行:
let task = async {
printfn "Task started on thread %d." Thread.CurrentThread.ManagedThreadId
do! Async.SwitchToThreadPool()
printfn "Task continued on thread %d." Thread.CurrentThread.ManagedThreadId
do! Async.SwitchToContext()
printfn "Task finished on thread %d." Thread.CurrentThread.ManagedThreadId
}
Async.StartImmediate(task)
// Output:
// Task started on thread 1.
// Task continued on thread 3.
// Task finished on thread 1.
可以看到,任务开始时在主线程上执行,然后在异步过程执行期间切换到线程池线程上,在完成后又返回到主线程上执行。因此,Async.StartImmediate不保证在整个过程中都在同一线程上执行。