小编Nig*_*Job的帖子

如何在 PowerShell 中检查后台作业是否完成但保持 Windows 窗体响应

Start-Job我创建了一个 Windows 表单,您可以在其中单击一个按钮来启动大约 15 分钟的备份过程(使用)。我使用它是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')
    })
Run Code Online (Sandbox Code Playgroud)

这在作业完成后给了我一个消息框,但表单在此过程中没有响应,可能是因为它仍在循环中使用线程的资源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') …
Run Code Online (Sandbox Code Playgroud)

powershell jobs multithreading winforms

5
推荐指数
1
解决办法
967
查看次数

标签 统计

jobs ×1

multithreading ×1

powershell ×1

winforms ×1