を実行していない私は、次のコードを実行した場合、イベントアクションが実行されます。のPowerShell:フォームでの仕事イベントアクション
$Job = Start-Job {'abc'}
Register-ObjectEvent -InputObject $Job -EventName StateChanged `
-Action {
Start-Sleep -Seconds 1
Write-Host '*Event-Action*'
}
文字列「イベント - アクション」が表示されます。
私はフォームを使用し、ボタンをクリックすることにより、上記のコードを起動した場合、
イベントアクションが実行されません:私は、もう一度ボタンをクリックしたときに
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$Form1 = New-Object Windows.Forms.Form
$Form1.Add_Shown({
$Form1.Activate()
})
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Text = 'Test'
$Form1.Controls.Add($Button1)
$Button1.Add_Click({
Write-Host 'Test-Button was clicked'
$Job = Start-Job {'abc'}
Register-ObjectEvent -InputObject $Job -EventName StateChanged `
-Action {
Start-Sleep -Seconds 1
Write-Host '*Event-Action*'
}
})
$Form1.ShowDialog()
のみ、最初のイベントアクションがあります実行される。
3回目のクリックで、2番目のイベントアクションが実行されます。
複数のクリックを連続して行うと、結果が予測できなくなります。私は右上のボタンでフォームを閉じると
はさらに、
最後の「オープン」イベントアクションが実行されます。
注:PSコンソールが特定の状況でのみ
文字列を表示するので、テストのためのPowerShell ISEは、好ましいことです。
誰かが私にここで何が起こっているのか手がかりを与えてくれますか?
ありがとうございます!
ニミツン。
説明していただきありがとうございますが、Formで何らかのアクションが発生するまで、StateChangedイベントが発生しない、またはメインスクリプトに表示されない理由はわかりません。私はそれを私に説明する別の試みに感謝します。
私が達成したいのは、PowerShellとFormsを使ったマルチスレッドのようなものです。スクリプトがユーザーにフォームを示し
「
:
私の計画は次のとおりです。
ユーザーは入力をしてボタンをクリックします。 ユーザーの入力に基づいて、一連のジョブがStart-Jobで開始され、各ジョブに対してStateChangedイベントが登録されます。
ジョブが実行されている間、ユーザーはフォームで任意のアクションを実行できます(ボタンを使用してジョブを停止するなど)。フォームは必要なときに再描画されます。
スクリプトは、フォームまたはその子コントロールによって起動されたすべてのイベントに反応します。
また、スクリプトは各ジョブのStateChangedイベントに反応します。
StateChangedイベントが発生すると、各ジョブの状態が検査され、すべてのジョブが「完了」状態の場合、ジョブの結果はReceive-Jobで取得され、ユーザーに表示されます。
「
このすべてがのstateChangedイベントがメインスクリプトに表示されていないことを除いて正常に動作します。
上記はまだ私のお気に入りの解決策であり、これを実装する方法が分かっている場合は、教えてください。
それ以外の場合は、少なくともユーザーにマルチスレッドの感触を与える回避策に頼ることになります。次の例に示します。
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$Form1 = New-Object Windows.Forms.Form
$Form1.Add_Shown({
$Form1.Activate()
})
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Text = 'Test'
$Form1.Controls.Add($Button1)
$Button1.Add_Click({
$Form1.Focus()
Write-Host 'Test-Button was clicked'
$Job = Start-Job {Start-Sleep -Seconds 1; 'abc'}
Do {
Start-Sleep -Milliseconds 100
Write-Host 'JobState: ' $Job.State
[System.Windows.Forms.Application]::DoEvents()
}
Until ($Job.State -eq 'Completed')
Write-Host '*Action*'
})
$Form1.ShowDialog()