From 967d4ad9b0428003ecaadd5cae80c26f9762f1a3 Mon Sep 17 00:00:00 2001 From: Max Kozlov Date: Thu, 15 Mar 2018 17:54:39 +0300 Subject: [PATCH 1/2] preserve job parameters ordering while search for jobs --- PoshRSJob/Public/Get-RSJob.ps1 | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/PoshRSJob/Public/Get-RSJob.ps1 b/PoshRSJob/Public/Get-RSJob.ps1 index 24b6ecb..e7f656d 100644 --- a/PoshRSJob/Public/Get-RSJob.ps1 +++ b/PoshRSJob/Public/Get-RSJob.ps1 @@ -102,7 +102,7 @@ Function Get-RSJob { $DebugPreference = 'Continue' } Write-Debug "ParameterSet: $($PSCmdlet.parametersetname)" - $Hash = @{} + $SearchProps = New-Object System.Collections.ArrayList $ResultJobs = New-Object System.Collections.ArrayList } Process { @@ -112,14 +112,12 @@ Function Get-RSJob { if ($PSCmdlet.ParameterSetName -eq 'Job') { Write-Verbose "Adding Job $($PSBoundParameters[$Property].Id)" foreach ($v in $PSBoundParameters[$Property]) { - $Hash.Add($v.ID,1) + [void]$SearchProps.Add($v.ID) } } elseif ($PSCmdlet.ParameterSetName -ne 'All') { Write-Verbose "Adding $($PSBoundParameters[$Property])" - foreach ($v in $PSBoundParameters[$Property]) { - $Hash.Add($v,1) - } + $SearchProps.AddRange($PSBoundParameters[$Property]) } } End { @@ -128,16 +126,20 @@ Function Get-RSJob { $States = if ($PSBoundParameters.ContainsKey('State')) { '^' + ($State -join '$|^') + '$' } else { '.' } # IF faster than any scriptblocks - if ($PSCmdlet.ParameterSetName -eq 'All') { - Write-Verbose 'All Jobs' + if ($Property -eq 'All') { + Write-Verbose "Get all Jobs" $ResultJobs = $PoshRS_Jobs } else { - Write-Verbose "Filtered Jobs by $Property" - foreach ($job in $PoshRS_Jobs) { - if ($Hash.ContainsKey($job.$Property)) - { - [void]$ResultJobs.Add($job) + Write-Verbose "Jobs by $Property" + # And Hash much faster than foreach{ foreach {} } inner loop + $Hash = @{} + foreach ($jobobj in $PoshRS_Jobs) { + $Hash[$jobobj.$Property] = $jobobj + } + foreach ($prop in $SearchProps) { + if ($Hash.Contains($prop)) { + [void]$ResultJobs.Add($Hash[$prop]) } } } From 0f9e24b71d3475e58740fa6a0936bdc8bc457006 Mon Sep 17 00:00:00 2001 From: Max Kozlov Date: Fri, 16 Mar 2018 14:45:15 +0300 Subject: [PATCH 2/2] Thread safety --- PoshRSJob/Public/Get-RSJob.ps1 | 46 +++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/PoshRSJob/Public/Get-RSJob.ps1 b/PoshRSJob/Public/Get-RSJob.ps1 index e7f656d..286bf93 100644 --- a/PoshRSJob/Public/Get-RSJob.ps1 +++ b/PoshRSJob/Public/Get-RSJob.ps1 @@ -125,31 +125,37 @@ Function Get-RSJob { if ($Property -eq 'Job') { $Property = 'ID' } $States = if ($PSBoundParameters.ContainsKey('State')) { '^' + ($State -join '$|^') + '$' } else { '.' } + [System.Threading.Monitor]::Enter($PoshRS_jobs.syncroot) + try { # IF faster than any scriptblocks - if ($Property -eq 'All') { - Write-Verbose "Get all Jobs" - $ResultJobs = $PoshRS_Jobs - } - else { - Write-Verbose "Jobs by $Property" - # And Hash much faster than foreach{ foreach {} } inner loop - $Hash = @{} - foreach ($jobobj in $PoshRS_Jobs) { - $Hash[$jobobj.$Property] = $jobobj + if ($Property -eq 'All') { + Write-Verbose "Get all Jobs" + $ResultJobs = $PoshRS_Jobs } - foreach ($prop in $SearchProps) { - if ($Hash.Contains($prop)) { - [void]$ResultJobs.Add($Hash[$prop]) + else { + Write-Verbose "Jobs by $Property" + # And Hash much faster than foreach{ foreach {} } inner loop + $Hash = @{} + foreach ($jobobj in $PoshRS_Jobs) { + $Hash[$jobobj.$Property] = $jobobj + } + foreach ($prop in $SearchProps) { + if ($Hash.Contains($prop)) { + [void]$ResultJobs.Add($Hash[$prop]) + } } } - } - foreach ($job in $ResultJobs) { - if (($job.State -match $States) -and - (-not $PSBoundParameters.ContainsKey('HasMoreData') -or $job.HasMoreData -eq $HasMoreData) - ) - { - $job + foreach ($job in $ResultJobs) { + if (($job.State -match $States) -and + (-not $PSBoundParameters.ContainsKey('HasMoreData') -or $job.HasMoreData -eq $HasMoreData) + ) + { + $job + } } } + finally { + [System.Threading.Monitor]::Exit($PoshRS_jobs.syncroot) + } } }