internal/scripts/runspaceWorkerCode.ps1
[PSFramework.Runspace.RSWorker]::WorkerCode = { param ( $__PSF_WorkerID ) # $__PSF_Workflow --> Workload Workflow provided by worker # $__PSF_Worker --> Current Worker Definition $ErrorActionPreference = 'Stop' trap { Write-PSFMessage -Level Error -Message "Runspace Worker Code failed" -ErrorRecord $_ $__PSF_Worker.State = 'Failed' $__PSF_Worker.SignalEnd() throw $_ } try { [runspace]::DefaultRunspace.Name = 'PSF-{0}-{1}-{2}' -f $__PSF_Workflow.Name, $__PSF_Worker.Name, $__PSF_WorkerID } catch { # No action - name is desirable, but cosmetic } # Generally, Constants are to be avoided. To guarantee no childcode can override the code to be executed, this is made constant. Set-Variable -Name __PSF_Begin -Value $__PSF_Worker.GetBegin() -Option Constant Set-Variable -Name __PSF_ScriptBlock -Value $__PSF_Worker.ScriptBlock -Option Constant Set-Variable -Name __PSF_End -Value $__PSF_Worker.GetEnd() -Option Constant # Consume per-Runspace Values as variables foreach ($key in $__PSF_Worker.PerRSValues.Keys) { Set-Variable -Name $key -Value $__PSF_Worker.PerRSValues[$key].Dequeue() } if ($__PSF_Begin) { try { $null = & $__PSF_Begin } catch { $__PSF_Worker.ErrorCount++ $__PSF_Worker.LastError = $_ # End worker right away to ensure the error is not drowned in subsequent errors return } } $validStates = 'Starting', 'Running' while ($validStates -contains $__PSF_Worker.State) { # Inqueue is closed and all items processed? if ($__PSF_Worker.IsDone) { break } if ($__PSF_Worker.MaxItems -and $__PSF_Worker.MaxItems -le $__PSF_Worker.CountInputCompleted) { break } if ($__PSF_Worker.Throttle) { $__PSF_Worker.Throttle.GetSlot() } $inputData = $null $success = $__PSF_Worker.GetNext([ref]$inputData) if (-not $success) { Start-Sleep -Milliseconds 250 continue } try { $results = $__PSF_ScriptBlock.InvokeGlobal($inputData) foreach ($result in $results) { if ($__PSF_Worker.NoOutput) { break } $__PSF_Workflow.Queues.$($__PSF_Worker.OutQueue).Enqueue($result) $__PSF_Worker.IncrementOutput() } $__PSF_Worker.IncrementInputCompleted() } catch { $__PSF_Worker.IncrementInputCompleted() $__PSF_Worker.ErrorCount++ $__PSF_Worker.AddError($_, $inputData) } } if ($__PSF_End) { try { $null = & $__PSF_End } catch { $__PSF_Worker.ErrorCount++ $__PSF_Worker.LastError = $_ } } $__PSF_Worker.SignalEnd() } |