我试图输入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的情况下使代码执行超时?
谢谢
答案 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
现在,您可以包括有关工作何时失败和发生的意外情况的信息,但我会让您知道。