Skip to content

Instantly share code, notes, and snippets.

@daxfohl
Last active August 12, 2016 15:25
Show Gist options
  • Save daxfohl/98e00169aca1f0a2828f1135e812302e to your computer and use it in GitHub Desktop.
Save daxfohl/98e00169aca1f0a2828f1135e812302e to your computer and use it in GitHub Desktop.
open System.Threading.Tasks
open System.Threading
open System
let criteria _ b = b = 10
let callback (i: int) =
Thread.Sleep(50)
printfn "Callback %d" i
let rec compute (task: Task) state =
async{
do! Async.Sleep 20
let newState = state + 1
printfn "Loop %d" newState
let task' = task.ContinueWith(fun _ -> callback(newState))
if criteria state newState then return newState
else return! compute task' newState
}
[<EntryPoint>]
let main _ =
async {
let task = Task.Factory.StartNew(fun()->printfn "Start")
let! x = compute task 0
printfn "Done %d" x
} |> Async.Start
Console.ReadLine() |> ignore
0
// Output:
// Start
// Loop 1
// Loop 2
// Callback 1
// Loop 3
// Loop 4
// Callback 2
// Loop 5
// Loop 6
// Callback 3
// Loop 7
// Callback 4
// Loop 8
// Loop 9
// Callback 5
// Loop 10
// Done 10
// Callback 6
// Callback 7
// Callback 8
// Callback 9
// Callback 10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment