Я думаю, ты немного потерян.Async.StartAsTask
, за которым следует Async.AwaitTask
, фактически отменяют друг друга, с побочным эффектом, который создает созданный в процессе Task
, на самом деле запускает асинхронный блок, содержащий blockingFoo
в пуле потоков.Так что это работает, но таким образом, что выдает ожидания.
Если вы хотите запустить оценку asyncFoo
из другого асинхронного блока, более естественным способом сделать это будет использование Async.Start
, если выне хочу ждать его завершения, или Async.StartChild
, если вы это сделаете.
let asyncFoo =
async {
blockingFoo() |> ignore
}
async {
// "fire and forget"
asyncFoo |> Async.Start
// trigger the computation
let! comp = Async.StartChild asyncFoo
// do other work here while comp is executing
// await the results of comp
do! comp
}