Если я запускаю следующий код, выполняется действие события:
$Job = Start-Job {'abc'}
Register-ObjectEvent -InputObject $Job -EventName StateChanged `
-Action {
Start-Sleep -Seconds 1
Write-Host '*Event-Action*'
}
Строка ' Событие-действие ' отображается.
Если я используюa Сформируйте и запустите указанный выше код, нажав кнопку
Действие события не выполнено:
[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()
Только когда я снова нажму кнопку, будет выполнено первое действие события.
Третьим щелчком мыши выполняется второе действие события и т. Д.
Если я сделаю несколько кликов в быстрой последовательности, результат непредсказуем.
Кроме того, когда я закрываю форму кнопкой в верхнем правом углу,
выполняется последнее «открытое» событие Event.
Примечание. Для тестирования PowerShell ISE предпочтительнее, поскольку консоль PS отображает
строку только при определенных обстоятельствах.
Может кто-нибудь подсказать, что здесь происходит?
Заранее спасибо!
nimizen.
Спасибо за ваше объяснение, но я не совсем понимаю, почему событие StateChanged не запускается или не отображается для основного сценария, пока не произойдет какое-либо действие сФорма.Я был бы признателен за еще одну попытку объяснить это мне.
То, чего я хочу достичь, - это своего рода многопоточность с помощью PowerShell и форм.
Мой план следующий:
'
Скрипт показывает форму пользователю.
Пользователь вводит данные и нажимает кнопку.На основании введенных пользователем данных набор заданий запускается с помощью 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()