private/JobTracking/Add-JobTracker.ps1

function Add-JobTracker {
    [CmdletBinding()]
    Param (
        [ValidateNotNull()]
        [Parameter(Mandatory = $true)]
        [string]$Name,
        [ValidateNotNull()]
        [Parameter(Mandatory = $true)]
        [ScriptBlock]$JobScript,
        $ArgumentList = $null,
        [hashtable]$JobData,
        [ScriptBlock]$CompletedScript,
        [ScriptBlock]$UpdateScript
    )
    
    # Start the job
    $job = Start-Job -Name $Name -ScriptBlock $JobScript -ArgumentList $ArgumentList
    
    if ($null -ne $job) {
        # Track the job
        $psObject = [PSCustomObject]@{
            Job               = $job
            CompleteScript = $CompletedScript
            UpdateScript   = $UpdateScript
        }
        
        If ($JobData) {
            $psObject | Add-Member -MemberType NoteProperty -Name "JobData" -Value $jobData
        }
        
        $psObject | Add-Member -MemberType NoteProperty -Name "Error" -Value $null
        
        [void]$JobTrackerList.Add($psObject)
        
        # Prevent UI/resource overload by limiting tracker list size
        $MaxTrackers = 100
        while ($JobTrackerList.Count -gt $MaxTrackers) {
            $JobTrackerList.RemoveAt(0) # Remove the oldest tracker
        }
        
        # Start the timer if it's not already running
        if (-not $timerJobTracker.Enabled) {
            $timerJobTracker.Start()
        }
    } elseif ($null -ne $CompletedScript) {
        Invoke-Command -ScriptBlock $CompletedScript -ArgumentList $null
    }
}