2017-05-16 2 views
3

여러개의 runspace가 다른 시간에 멈추기 시작하는 runspace 풀을 생성 중입니다.arraylist의 runspace에 대한 Register-ObjectEvent

내 모든 실행 영역을 추적하려면 컬렉션으로 이동하십시오.

GUI에있는 사용자에게 runspace의 정보를 반환 할 수 있도록 각 이벤트 이벤트를 등록하려고합니다. 현재 열심히 테스트를 위해 0으로 구분 한 코드가 레지스터 objectevent 줄에 실패

$Global:RunspaceCollection 
$Global:x = [Hashtable]::Synchronized(@{}) 

$RunspaceCollection = @() 
[Collections.Arraylist]$Results = @() 

$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1,5) 
$RunspacePool.Open() 

$action = { 
    Foreach($Runspace in $Global:RunspaceCollection.ToArray()) { 
     If ($Runspace.runspace.iscompleted){ 
      $results.add($runspace.powershell.endinvoke($Runspace.runspace)) 

      $runspace.powershell.dispose() 
      $runspacecollection.remove($Runspace) 
      Write-Host "I AM WORKING" 
      test-return 

    } 
} 
Function Start-PasswordReset($username) { 

    $scriptblock = { 
    Param($userame) 
    start-sleep -Seconds 10 
    $Result = "I have reset" + $username 
    $result 
} 

$Powershell = [PowerShell]::Create().AddScript($ScriptBlock).AddArgument($username) 
$Powershell.RunspacePool = $RunspacePool 

[Collections.Arraylist]$Global:RunspaceCollection += New-Object -TypeName PSObject -Property @{ 
    Runspace = $PowerShell.BeginInvoke() 
    PowerShell = $PowerShell 

} 
Register-ObjectEvent -InputObject $runspacecollection[0].Runspace -EventName statechanged -Action $Action 
} 


} 

하지만 현재 실행 영역 수있을 것입니다 :

나는 문제가 있어요 부분은 여기 최종 버전에서. 나는 작은 실수를 저 지르거나 이것이 어떻게 작동하는지에 대한 근본적인 이해가 부족하다는 것을 알지 못합니다. 나는 두 가능성에 모두 열려 있습니다!

+1

실제로 달성하려는 내용이 명확하지 않습니다. 당신이 게시 한 코드가 작동하지 않습니다, 나를 위해 배열 목록에 새 개체를 추가하지 못했습니다, 그 완전한 코드가 아니어야합니까? Register-Object 이벤트에는 개체에서 발생하는 이벤트가 필요하므로 PSObject.Runspace에 StateChanged 이벤트가 있어야합니다. 더 완벽한 코드 목록이나 달성하려는 내용에 대한 자세한 설명을 제공해주십시오. –

+0

완전한 코드가 아니며, tommorow로 돌아 가면 게시 할 것입니다. 본질적으로 나는 컬렉션에 저장되어있는 Runspace 객체가 statechanged 이벤트를 가지길 기대하지만, get-member로 체크하면 누락되었습니다. – Lister

+0

@BenRichards 전체를 많이 추가했습니다. 이것은 변수 & 쉘에 쓰는 것 외에는 실제로 아무것도하지 않는 테스트 함수입니다. 작동이 끝나면 장시간 실행되는 작업을 방해하기 위해 GUI 뒤에 넣을 계획입니다. 완료하는 데 최대 2 분이 소요될 수있는 동시에 여러 번 실행됩니다. – Lister

답변

0

몇 가지 문제가 있지만 StateChanged 이벤트가 RunspaceCollection.Runspace (사용자 지정 "Runspace"속성 인 PSObject의 RunspaceCollection [index])가 아닌 RunspacePool.Powershell 개체의 이벤트 인 것이 가장 좋습니다. 만들었습니다.)

는에서와 같이 파워 쉘 개체에 대한 사용자의 실행 영역을 설정합니다

$powershell = [PowerShell]::Create() 
$powershell.RunspacePool = $runspacePool 
$powershell.AddScript($scriptBlock).AddArgument($username) 
$Global:runspaceCollection += @{ 
    PowerShell = $powershell 
    Handle  = $powershell.BeginInvoke() 
} 

그리고 다음과 같이 이벤트를 선언 : 그 후, 난 당신이 시작 -이 의도 생각하지 않는다

Register-ObjectEvent -InputObject $Global:runspaceCollection[0].PowerShell.RunspacePool -EventName StateChanged -Action $Action 

"Action"기능의 비밀번호 재설정 기능. 나를 위해 일한 완전한 코드는 다음과 같습니다.

$Global:RunspaceCollection 
$Global:x = [Hashtable]::Synchronized(@{}) 

$RunspaceCollection = @() 
[Collections.Arraylist]$Results = @() 

$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, 5) 
$RunspacePool.Open() 

$action = { 
    Foreach ($Runspace in $Global:RunspaceCollection.ToArray()) { 
     If ($Runspace.runspace.iscompleted) { 
      $results.add($runspace.powershell.endinvoke($Runspace.runspace)) 

      $runspace.powershell.dispose() 
      $runspacecollection.remove($Runspace) 
      Write-Host "I AM WORKING" 
      test-return 
     } 
    } 
} 

Function Start-PasswordReset($username) { 
    $scriptblock = { 
     Param($userame) 
     start-sleep -Seconds 10 
     $Result = "I have reset" + $username 
     $result 
    } 

    $powershell = [PowerShell]::Create() 
    $powershell.RunspacePool = $runspacePool 
    $powershell.AddScript($scriptBlock).AddArgument($username) 
    $Global:runspaceCollection += @{ 
     PowerShell = $powershell 
     Handle  = $powershell.BeginInvoke() 
    } 

    Register-ObjectEvent -InputObject $Global:runspaceCollection[0].PowerShell.RunspacePool -EventName StateChanged -Action $Action 
} 
+0

피드백을 주셔서 대단히 감사합니다. 나는 tommorow에 가서 어떻게 할 수 있는지 알려줄 것입니다. – Lister

+0

물론! 네가하고있는 일을 내가 할 수 있다는 것을 몰랐어. 나도 무언가를 배웠어! –

+0

아무도없는 이음새는 실행 잠금에서 스레드 잠금을 해제하는 방식으로 결과를 표시하는 것을 실제로 고려했습니다. GUI를 실행하는 경우에는 매우 짜증이납니다! 저는 지난 주에 런 공간에 대해서만 배웠습니다. 그러나 일단 내가 알아 낸 것은 내 인생을 더 쉽게 만들 수있는 잠재력이 있습니다. – Lister