Powershell开始 - 睡眠冻结/阻止交互在我的Winforms上



我正在尝试输入 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
    }
 }

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

我建议您使用Start-Job(最简单(或 Runspace(有点难做但高效(为您的任务做后台作业,这样您就不必依赖睡眠计时器来确保您的命令完成。但那是你的特权。

但是,您可以使用这个巧妙的小技巧,尽管不理想,但可以解决无响应的表单问题。使用以下模块引入 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

现在你可以包括工作失败时的意外情况和其他东西,但我会让你弄清楚。

最新更新