Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to wait for async to finish

I would like to run some async workflow, then wait for it to finish before printing some results, example:

let dowork n =
    async {
        do printfn "work %d" n
    }

let creatework() =
    async {
        for x in [1..5] do
            Async.Start(dowork x)
    }

Async.RunSynchronously(creatework())    
printfn "finished"

when I run this, I want all the dowork calls to finish before printing "finished". However I get results like this:

work 2 work 3 work 4 work 5 finished work 1

I have tried removing async from creatework() but "finished" is printed before the async workflows are run.

In the real dowork, the program performs some IO, so I want to wait for the slowest one to finish before continuing.

like image 380
yanta Avatar asked Nov 05 '10 14:11

yanta


1 Answers

Well answering my own question seems lame, but this seems to work. Someone come up with something better so I can award them the answer :)

let dowork n =
    async {
        do printfn "work %d" n
    }

let creatework() =
    [1..5] |> Seq.map dowork |> Async.Parallel |> Async.RunSynchronously

creatework()    
printfn "finished"

It gives various output, but "finished" so far is always last...

like image 154
yanta Avatar answered Oct 05 '22 19:10

yanta