Chapters/scripting-at-scale/jobfunctiontemplate.ps1

Function Get-Foo {
    [cmdletbinding()]
    Param(
        [Parameter(Position = 0, ValueFromPipeline)]
        $This,
        $That,
        $TheOtherThing
    )

    Begin {
      #initialize an array to hold job objects
      $jobs = @()

      $mycode = {
         #define your code to run with parameters if necessary
         #parameters will need to be passed positionally
         Param($this, $that)
         #awesome PowerShell code goes here
        }
    }

    Process {
      #add the job to the array
      $jobs += Start-Job -ScriptBlock $mycode -ArgumentList $this, $that
    }

    End {
     #wait for all jobs to complete
     Write-Host "Waiting for background jobs to complete" -ForegroundColor Yellow
     $jobs | Wait-Job

     #receive job results
     #or bring job results back in to the function and do
     #something with them
     $jobs |
     Get-Job -ChildJobState Completed -HasMoreData $True |
     Receive-Job -keep
    }

}