Из документация видно, что Async.RunSynchronously запускает асинхронное вычисление и ожидает его результата. Я также читал, что это похоже на ожидание в С#. Мне любопытно, блокирует ли это поток до тех пор, пока он не будет завершен?
Да, Async.RunSynchronously
блокирует. Простая иллюстрация:
let work = async {
printfn "Async starting"
do! Async.Sleep(1000)
printfn "Async done" }
printfn "Main starting"
work |> Async.RunSynchronously
printfn "Main done"
Это напечатает:
Main starting
Async starting
Async done
Main done
Это примерно похоже на task.RunSynchronously
в C#, хотя могут быть некоторые тонкие отличия (рабочий процесс F# будет выполняться с использованием пула потоков, в то время как основной поток заблокирован и ожидает завершения, в то время как эквивалент C# может фактически выполнять работу над текущим потоком). поток, который больше похож на StartImmediate
в F#, но который, однако, не ждет).