Table of contents
Collapse the table of content
Expand the table of content

Async.StartChild<'T> Method (F#)

Den Delimarsky|Last Updated: 10/30/2017
2 Contributors

Starts a child computation within an asynchronous workflow. This allows multiple asynchronous computations to be executed simultaneously.

Namespace/Module Path: Microsoft.FSharp.Control

Assembly: FSharp.Core (in FSharp.Core.dll)


// Signature:
static member StartChild : Async<'T> * ?int -> Async<Async<'T>>

// Usage:
Async.StartChild (computation)
Async.StartChild (computation, millisecondsTimeout = millisecondsTimeout)


computation Type: Async<'T>

The child computation.

millisecondsTimeout Type: int

The timeout value in milliseconds. If one is not provided then the default value is -1, which corresponds to System.Threading.Timeout.Infinite.

Return Value

Returns a new computation that waits for the input computation to finish.


This method should normally be used as the immediate right-hand-side of a let! binding in an F# asynchronous workflow, that is:

async { 
let! completor1 = childComputation1
|> Async.StartChild
let! completor2 = childComputation2
|> Async.StartChild
let! result1 = completor1
let! result2 = completor2
... }

When used in this way, each use of StartChild starts an instance of childComputation and returns a completor object representing a computation to wait for the completion of the operation. When executed, the completor awaits the completion of childComputation.

If child computation doesn't complete in the specified timeout period, the childComputation is cancelled and the completor raises System.TimeoutException.


The following code example illustrates the use of Async.StartChild.

open System.Windows.Forms

let bufferData = Array.zeroCreate<byte> 100000000

let asyncChild filename =
        async {
            printfn "Child job start: %s" filename
            use outputFile = System.IO.File.Create(filename)
            do! outputFile.AsyncWrite(bufferData)
            printfn "Child job end: %s " filename

let asyncParent =
        async {
            printfn "Parent job start."
            let! childAsync1 = Async.StartChild(asyncChild "longoutput1.dat")
            let! childAsync2 = Async.StartChild(asyncChild "longoutput2.dat")
            let! result1 = childAsync1
            let! result2 = childAsync2
            printfn "Parent job end."

let form = new Form(Text = "Test Form")
let button = new Button(Text = "Start")
button.Click.Add(fun args -> Async.Start(asyncParent)
                             printfn "Completed execution." )

Sample Output

The output is interleaved because the jobs are running simultaneously.
ComplParent job start.
eted execution.
Child job start: Child job slongoutput1.dat
tart: longoutput2.dat
Child job end: longoutput2.dat
Child job end: longoutput1.dat
Parent job end.


Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2

Version Information

F# Core Library Versions

Supported in: 2.0, 4.0, Portable

See Also

Control.Async Class (F#)

Microsoft.FSharp.Control Namespace (F#)

© 2020 Microsoft