Поток диспетчера и поток рендеринга пользовательского интерфейса работают, когда форма WPF находится в свернутом состоянии - PullRequest
0 голосов
/ 27 сентября 2011

У меня два вопроса относительно ветки диспетчера WPF.

  1. Поток диспетчера продолжает работать, когда ваша форма WPF находится в свернутом состоянии.
  2. У меня так много динамических обновлений, поэтому я обновляю их до winform, а затем пользователь Timer в winform для обновления пользовательского интерфейса. В winform, когда вы свернули winform, ваш таймер перестанет работать, так как он создан в потоке пользовательского интерфейса. Так что загрузка моего процессора низкая. Если мне нужно добиться того же поведения в WPF MVVM, то как мне этого добиться?

1 Ответ

2 голосов
/ 27 сентября 2011

Оба ваших вопроса, похоже, предполагают, что сворачивание вашего приложения каким-то образом остановит некоторые ваши потоки.Я не знаю, откуда у вас эта идея, но это совершенно неправильно.Ваш поток пользовательского интерфейса все еще работает, даже когда вы свернуты.Как еще она будет обрабатывать команду «восстановление», когда вы ее минимизируете?Как Windows сможет отображать свой заголовок на панели задач?

Вы также, кажется, думаете, что в WPF есть «нить диспетчера», которая каким-то особенным образом.Это не тот случай.Диспетчер занимает место в очереди сообщений Windows, что означает, что он подключен к потоку пользовательского интерфейса.То, что вы называете «потоком диспетчера», - это то же самое, что и , что и поток пользовательского интерфейса.Если вы используете WinForms и WPF в одном приложении, они оба работают в одном и том же потоке пользовательского интерфейса (если вы не запускаете новые потоки вручную и не запускаете на них собственных диспетчеров, но это довольно необычный сценарий).

И нет, ваш таймер не перестает работать только потому, что ваше приложение свернуто (если вы не написали код вручную, чтобы остановить его).Попробуйте: добавьте вызов к Console.Beep() в своем событии отметки времени, а затем попробуйте свести к минимуму ваше приложение и убедитесь, что оно продолжает шуметь.

Вот мое предположение: в событии Tick вашего таймера ваши WinFormsприложение вызывает Invalidate ().Когда приложение свернуто, Invalidate ничего не делает - окно не отображается, поэтому нечего делать недействительным - поэтому вы видите низкую загрузку ЦП, потому что она ничего не делает.

Если вы хотите такое же поведение вWPF, лучше всего добавить этот код в начало вашего тика:

if (WindowState == WindowState.Minimized)
    return;
...