我正在尝试输入 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
现在你可以包括工作失败时的意外情况和其他东西,但我会让你弄清楚。