我已经创建了Windows窗体,您可以在其中单击一个按钮来启动大约15分钟的备份过程(使用Start-Job
)。我使用Start-Job
来使表单在备份过程中保持响应状态(通过响应,我是说您可以移动它,将其最小化,等等)。但是,我希望表单在工作完成后弹出一个消息框,而我无法设法获得正确的结果。
[起初,我尝试了一个While
循环,该循环每10秒检查一次作业是否完成:
$BackupButton.Add_Click( {
$BackupJob = Start-Job -ScriptBlock { ... }
$Completed = $false
while (!($Completed)) {
if ($BackupJob.State -ne "Running") {
$Completed = $true
}
Start-Sleep -Seconds 10
}
[System.Windows.Forms.MessageBox]::Show('Successfully completed the backup process.', 'Backup Tool', 'OK', 'Info')
})
[作业完成后,这给了我一个消息框,但表单在此过程中没有响应,可能是因为它仍在While
循环中使用线程的资源。
然后,我尝试使用Register-ObjectEvent
调用消息框以显示作业状态何时更改:
$BackupButton.Add_Click( {
$BackupJob = Start-Job -ScriptBlock { ... }
Register-ObjectEvent $BackupJob StateChanged -Action {
[System.Windows.Forms.MessageBox]::Show('Successfully completed the backup process.', 'Backup Tool', 'OK', 'Info')
}
})
此选项确实使表单在处理过程中保持响应,但是直到我关闭Windows表单时,消息框(事件的动作块)才开始启动。
是否有任何选项既可以使消息框按时显示(在窗体关闭时不显示),又可以不使用窗体的线程(使它保持响应状态?]
Edit:
或者,是否有一种方法可以从后台作业控制我的表单?我试图将表单的按钮/控件作为作业的参数发送,然后从作业中控制表单的事件,但是它不起作用。如果可以通过某种方式从后台作业访问表单,这也将解决我的问题。提前感谢。
我已经创建了Windows表单,您可以在其中单击一个按钮来启动大约15分钟的备份过程(使用“开始作业”)。我使用Start-Job是为了在备份过程中保持表单的响应速度。...
Start-Sleep
cmdlet使您的表单无响应。为了解决这个问题,请改用System.Windows.Forms.Timer
对象。