Runspace issue - Adding timeout to each runspace

I have a script that runs various Active Directory-related tasks in parallel. It runs fine for the most part. However, when running on around 2,000 machines, it gets hung up near the end (I’m guessing due to max runspaces getting hung up). I have yet to find a straight-forward way of using a timer for each runspace. I have a way of exiting the runspace if the TOTAL time reaches a certain number, but not for each individual runspace. Can anyone suggest a way to keep track of how many runspaces are running at once and how to add a timeout for each runspace?

Here is my timeout/stopwatch for the overall runspace time:

$sw = [system.diagnostics.stopwatch]::startNew()

While ($RunspaceCollection)
{
	Foreach ($Runspace in $RunspaceCollection.ToArray())
	{
		
		If ($Runspace.Runspace.IsCompleted)
		{
			[void]$Results.Add($Runspace.PowerShell.EndInvoke($Runspace.Runspace))
			$Runspace.PowerShell.Dispose()
			$RunspaceCollection.Remove($Runspace)
		} 
	}
	
	Start-Sleep -Milliseconds 1000
	If ($sw.Elapsed.TotalMinutes -gt 30) { break }
}
$sw.Stop()

Take a look at this series and see if that gives you ideas. Specifically as to your…

Can anyone suggest a way to keep track of how many runspaces are running at once

… See the info in the 4th bullet

Beginning Use of PowerShell Runspaces

• Beginning Use of PowerShell Runspaces: Part 1 Begin use with runspaces.
• Beginning Use of PowerShell Runspaces: Part 2 Begin use with runspaces.
• Beginning Use of PowerShell Runspaces: Part 3 Use runspace pools for multithreading.
• A Look at the PoshRSJob Module Learn about a module for working with runspaces.

As for …

how to add a timeout for each runspace?

See this post… ‘powershell.org/forums/topic/timeout-for-runspace
and see…
Runspace​Connection​Info Class
RunspaceConnectionInfo Class (System.Management.Automation.Runspaces) | Microsoft Learn

Cancel​Timeout The duration (in ms) for which PowerShell should wait before it times out on cancel operations (close runspace or stop powershell). For instance, when the user hits ctrl-C, New-PSSession cmdlet tries to call a stop on all remote runspaces which are in the Opening state. The administrator wouldn't mind waiting for 15 seconds, but this should be time bound and of a shorter duration. A high timeout here like 3 minutes will give the administrator a feeling that the PowerShell client has hung.