Спи внутри для петли в wpf - PullRequest
1 голос
/ 10 ноября 2011

Я работал с WPF и потоками.

Я бы хотел приостановить весь экран (только приложение) во время цикла for.

* 1005 Е.Г. *

foreach (classA a in classesA)
{
....
....
Thread.sleep(100);

}

Однако я обнаружил, что он будет долго спать, а затем выполнит все операторы за раз. Это не то, что я хочу. Я хочу спать внутри выполнения цикла for. То есть спать 100 мс после 1-го цикла, затем снова спать после 2-го цикла .....

Я обнаружил, что в какой-то статье упоминается DoEvents (), но я не совсем знаком с ним, и, похоже, в WPF такого нет.

В некоторых других статьях упоминается DispatcherTimer. Тем не менее, он не будет блокировать экран. Я хотел бы заблокировать весь экран (только приложение), чтобы предотвратить нажатие любой кнопки во время выполнения цикла for.

Как я мог это сделать?

Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Вы не должны блокировать UI-поток, иначе он не сможет обработать свою очередь, которая содержит визуализацию UI, если вы хотите заблокировать взаимодействие с UI-элементами, установленными IsEnabled=false на корневом элементе, затем сделать неблокирующуюподождите см этот вопрос .

0 голосов
/ 15 ноября 2011

Если вы хотите поэкспериментировать с предложенными ключевыми словами async и await, вы можете достичь поведения сна с помощью синхронной семантики, подобной этой.Для этого вам потребуется установить Async CTP . 1

public aysnc void YourButton_Click(object sender, EventArgs args)
{
  foreach (classA a in classes)
  {
    await Task.Delay(100);
  }
}

1 AsyncCTP использует TaskEx вместо Task.

...