PowerShell - Почему моя кнопка не нажимается во время цикла while? - PullRequest
1 голос
/ 20 сентября 2019

Это моя функция:

Function StartProgress
{
    $x = 600
    $length = $x / 100
        while($x -gt 0) {
        $min = [int](([string]($x/60)).split('.')[0])
        $lblCnt.Text = " " + $min + " minutes " + ($x % 60) + " seconds left"
        $pbrCnt.Value = $pbrCnt.Maximum - $x
        Start-Sleep -Seconds 1
        $x--
        }
}

, и я добавил ее здесь:

$timer.add_Tick({StartProgress})

В основной форме есть кнопка, на которую нельзя нажать во время цикла while.Почему?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

Как уже указывалось, принудительное синхронное ожидание с Start-Sleep блокирует поток пользовательского интерфейса в целом и делает вашу форму не отвечающей .

Вместо использования Start-Sleep, пусть таймер периодически вызывает вашу функцию , раз в секунду;Затем вам нужно отслеживать свое состояние с помощью переменной уровня сценария:

$script:x = 600

Function StartProgress {
  $length = $script:x / 100
  $min = [int](([string]($script:x / 60)).split('.')[0])
  $lblCnt.Text = " " + $min + " minutes " + ($script:x % 60) + " seconds left"
  $pbrCnt.Value = $pbrCnt.Maximum - $script:x
  if (--$script:x -eq 0) { $timer.Dispose() }
}

$timer.Interval = 1000 # 1 sec.
$timer.add_Tick({StartProgress})
$timer.Start()

Обратите внимание, как .Dispose() вызывается на $timer, когда $script:x достигает 0, чтобы предотвратить дальнейшие события отполучать генерируемый;если обработка останавливается раньше, вы должны вызвать $timer.Dispose() вручную.

0 голосов
/ 20 сентября 2019

в цикле while вы не придете к моменту, когда ваше приложение успеет вызвать обновления.Без выдачи обновлений (PropertyChangedEvent и т. Д.) Пользовательский интерфейс не будет уведомлен об измененных данных.

...