如何检查后台作业是否已完成,但要使Windows窗体在PowerShell中保持响应状态

问题描述 投票:4回答:1

我已经创建了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是为了在备份过程中保持表单的响应速度。...

multithreading winforms powershell jobs
1个回答
0
投票

Start-Sleep cmdlet使您的表单无响应。为了解决这个问题,请改用System.Windows.Forms.Timer对象。

© www.soinside.com 2019 - 2024. All rights reserved.