我的Winform上的Powershell启动-睡眠冻结/阻止交互

时间:2019-06-18 10:05:05

标签: winforms powershell

我试图输入10秒等待时间以便在脚本中执行命令。
问题是,当我运行开始睡眠模式时,我的界面会闪烁或阻塞窗口。
我试图在不使用启动睡眠的情况下执行特殊功能,但同样的事情也会发生。

第一个解决方案(冻结/阻止交互窗口)

if ($Timeout -gt 0) {
   Start-Sleep -seconds $Timeout
}

第二个解决方案(冻结/阻止交互窗口)

if ($Timeout -gt 0) {
  Timeout $Timeout
}

function Timeout($seconds) {
    $doneDT = (Get-Date).AddSeconds($seconds)
    while($doneDT -gt (Get-Date)) {
        $secondsLeft = $doneDT.Subtract((Get-Date)).TotalSeconds
        write-host $secondsLeft
    }
 }

如何在不冻结winform的情况下使代码执行超时?
谢谢

1 个答案:

答案 0 :(得分:1)

我建议您使用Start-Job(最简单)或运行空间(有点困难,但效率很高)来完成任务,因此您不必依靠睡眠计时器来确保您的工作命令完成。但这是您的特权。

但是,您可以使用这种巧妙的小技巧(尽管不理想)来解决无响应的表单问题。使用下面的代码块介绍10s延迟。

for ($i = 0; $i -lt 50; $i++)
{
    Start-Sleep -Milliseconds 200
    [System.Windows.Forms.Application]::DoEvents()
}

编辑:包括建议。 当然,您可以在WinForms中执行此操作。我以前做过。出于效率和资源的原因,我后来才移至Runspaces。但是出于简单的目的,Start-Job是最简单的方法。

$ScriptBlock = {
    #super lengthy code enclosed in paranthesis to create a scriptblock
    #say takes a large amount of time to complete
}
$myJob = Start-Job -ScriptBlock $ScriptBlock

Do
{
    Start-Sleep -Milliseconds 100
    [System.Windows.Forms.Application]::DoEvents()
}
While ($myJob.State -ne "Completed")

$myJob | Receive-Job

现在,您可以包括有关工作何时失败和发生的意外情况的信息,但我会让您知道。