Powershell start-sleep freeze / block взаимодействия на моих winforms - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь ввести 10-секундное ожидание для выполнения команды в моем скрипте.
Проблема в том, что когда я запускаю start-sleep, мой интерфейс мерцает или блокирует окно.
Я пытался сделатьспециальная функция без использования start-sleep, но происходит то же самое.

Первое решение (окна взаимодействия Freeze / Block)

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

Второе решение (окна взаимодействия Freeze / Block)

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?
Спасибо

1 Ответ

1 голос
/ 18 июня 2019

Я бы посоветовал вам выполнить фоновое задание, используя Start-Job (самое простое) или Runspace (немного сложно сделать, но эффективно) для вашей задачи, поэтому вам не нужно полагаться на таймер сна, чтобы убедиться, что ваша команда выполнена. , Но это ваша прерогатива.

Тем не менее, вы можете использовать этот изящный маленький трюк, хотя и не идеальный, чтобы противостоять вашей не реагирующей проблеме с формой. Используйте приведенный ниже блок для ввода задержки 10 с.

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

Теперь вы можете включить непредвиденные расходы на случай неудачи и прочее, но я позволю вам разобраться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...