<# .SYNOPSIS PS 09: Multithreading mit ForEach-Object -Parallel & Start-ThreadJob .DESCRIPTION Lerne moderne Parallelisierung in PowerShell 7+: - ForEach-Object -Parallel mit -ThrottleLimit - Thread-Scope Zugriff mit $using:Var - Asynchrone Jobs mit Start-ThreadJob - Parallele Batchverarbeitung und Performance-Messung #> # 🎯 TEILZIEL 1 (TODO 1): Invoke-ParallelPing <# .DESCRIPTION Überprüft eine Liste von Rechnernamen/IPs parallel auf Erreichbarkeit. Nutzt `ForEach-Object -Parallel` mit dem Parameter `-ThrottleLimit`. Greift über `$using:TimeoutMs` auf den Timeout-Wert zu. .OUTPUTS Array von [PSCustomObject] mit Eigenschaften: ComputerName, Status ('Online' oder 'Offline'), ResponseTimeMs, Timestamp #> function Invoke-ParallelPing { [CmdletBinding()] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [string[]]$ComputerNames, [Parameter()] [ValidateRange(1, 64)] [int]$ThrottleLimit = 5, [Parameter()] [ValidateRange(50, 10000)] [int]$TimeoutMs = 1000 ) # TODO: Führe die Ping-Simulation parallel für jeden Computer in $ComputerNames aus. # Nutze ForEach-Object -Parallel -ThrottleLimit $ThrottleLimit # Verwende $using:TimeoutMs innerhalb des Parallel-Blocks. # Gib für jeden Host ein [PSCustomObject] zurück. return @() } # 🎯 TEILZIEL 2 (TODO 2): Start-AsyncServerTask <# .DESCRIPTION Startet einen leichtgewichtigen Hintergrund-Threadjob mit `Start-ThreadJob`. .OUTPUTS Das Job-Objekt von Start-ThreadJob #> function Start-AsyncServerTask { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$TaskName, [Parameter(Mandatory = $true)] [scriptblock]$ScriptBlock, [Parameter()] [object[]]$ArgumentList = @() ) # TODO: Starte den Thread-Job mit Start-ThreadJob und gib das Job-Objekt zurück. return $null } # 🎯 TEILZIEL 3 (TODO 3): Wait-AndCollectThreadJobs <# .DESCRIPTION Wartet auf den Abschluss einer Liste von Jobs (mit Timeout), sammelt alle Ergebnisse ein und entfernt die Jobs anschließend sauber aus der Job-Tabelle. .OUTPUTS Array mit den Ausgaben aller Jobs #> function Wait-AndCollectThreadJobs { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [object[]]$Jobs, [Parameter()] [int]$TimeoutSeconds = 10 ) # TODO: # 1. Warte mit Wait-Job auf die übergebenen $Jobs unter Berücksichtigung von $TimeoutSeconds. # 2. Hole alle Ausgaben mit Receive-Job ab. # 3. Entferne die Jobs mit Remove-Job -Force. # 4. Gib die gesammelten Resultate zurück. return @() } # 🎯 TEILZIEL 4 (TODO 4): Invoke-ThrottledBatchProcessing <# .DESCRIPTION Verarbeitet eine Liste von Datenobjekten parallel mit gedrosselter Parallelität (-ThrottleLimit) und misst die Gesamtlaufzeit. .OUTPUTS [PSCustomObject]@{ TotalItems = [int] ProcessedItems = [array] SuccessCount = [int] DurationMs = [double] } #> function Invoke-ThrottledBatchProcessing { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [object[]]$Items, [Parameter(Mandatory = $true)] [scriptblock]$ProcessBlock, [Parameter()] [ValidateRange(1, 32)] [int]$ThrottleLimit = 4 ) # TODO: # 1. Starte eine Stoppuhr mit [System.Diagnostics.Stopwatch]::StartNew() # 2. Führe $ProcessBlock parallel für jedes Item in $Items aus (unter Beachtung von $ThrottleLimit). # 3. Berechne SuccessCount (Anzahl der Resultate mit Success = $true). # 4. Stoppe die Stoppuhr und gib das aggregierte Ergebnis-Objekt zurück. return $null }