Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
Export (0) Print
Expand All

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

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)


Type: Async<'T>

The child computation.


Type: int

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

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.

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

F# Core Library Versions

Supported in: 2.0, 4.0, Portable

© 2015 Microsoft