-
-
Save daxfohl/98e00169aca1f0a2828f1135e812302e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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