2011-12-04 2 views
9

У меня нет конкретного сценария, но этот вопрос просто перешел мне на ум, когда я думал о сценариях, где я могу использовать таймер над DispatcherTimer.Производительность для Timer vs DispatcherTimer

В сценарии, где я должен выполнять прийти в вычислительном интенсивную задачу всякий раз, когда таймер срабатывает событие, а затем сделать незначительные изменения в пользовательском интерфейсе, было бы лучше с точки зрения производительности на:

  1. использования в регулярный таймер, а затем использовать Диспетчер приложений для изменить пользовательский интерфейс
  2. использовать DispatcherTimer (и, возможно, выполнить мою вычислительную работу в каком-нибудь рабочем месте рабочего стола async).

Мое предположение заключается в том, что поддержание разлома нити пользовательского интерфейса как можно дольше увеличит пользовательский интерфейс. Если это целесообразно, есть ли уловы, о которых я должен знать в таком сценарии?

EDIT:

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

Предположим, что я должен читать большой файл каждые 2 минуты, и когда я закончил, мне нужно добавить элемент в ListBox. Предположим, что чтение/обработка файла занимает 10-15 секунд, в течение которого я не работаю с пользовательским интерфейсом. Какой был бы лучший подход для чего-то подобного?

ответ

2

После еще нескольких исследований и анализа я пришел к выводу, что регулярный таймер работает лучше всего в моем придуманном примере. До сих пор мне не приходилось искать что-то конкретное, что могло бы вызвать потенциальные проблемы в моем коде. Сказав это, хорошие методы кодирования никогда не повредят!

1
  • Таймер генерирует повторяющиеся события в приложении

  • DispatcherTimer представляет собой таймер, который встроен в Диспетчер очереди , который обрабатывается на определенном интервале времени и при заданным приоритетом.

Таймеры не гарантируют выполнение точно, когда происходит интервал времени, но гарантированно не выполняться до того, как произойдет интервал времени. Это связано с тем, что операции DispatcherTimer помещаются в очередь диспетчера, как и другие операции. Когда выполняется операция DispatcherTimer, она зависит от других заданий в очереди и их приоритетов.

Если таймер используется в WPF application, стоит отметить, что Timer runs on a different thread then the user interface (UI) thread. Чтобы получить доступ к объектам в потоке пользовательского интерфейса (UI), необходимо отправить операцию в поток Диспетчер потока пользовательского интерфейса (UI) с помощью Invoke или BeginInvoke. Причины использования DispatcherTimer против Timer заключаются в том, что DispatcherTimer работает в том же потоке, что и Dispatcher и DispatcherPriority.

+1

Возможно, я должен уточнить свой вопрос, но я уже знаю, что таймер работает в отдельном потоке и что Диспетчер должен касаться пользовательского интерфейса в этом случае. Мне было любопытно, когда можно использовать таймер в приложении WPF, даже когда мне нужно прикоснуться к пользовательскому интерфейсу. –

0

Если вы хотите изменить скалярное (не коллекционное) значение, привязанное к элементу пользовательского интерфейса, вы можете сделать это не только из потока пользовательского интерфейса (например, из делегата таймера). И в этом случае вам не нужно использовать Dispatcher.Invoke/BeginInvoke.

0

Другой вариант - использовать DispatcherTimer с созданием экземпляра класса BackgroundWorker на каждой итерации таймера. Это также освобождает вас от использования Dispatcher.Invoke/BeginInvoke во многих случаях.

+0

Я знаю мои варианты :). Я ищу некоторое представление о том, что будет * идеальным * вариантом. –

5

Главная точка:

для выполнения интенсивных вычислений приходят задачу

Это указывало бы не с помощью DispatcherTimer. Он в основном существует для выполнения небольших задач в основном потоке и избегает создания другого потока.

Если вы используете DispatcherTimer, чтобы начать работу с фоном, вы обойдете его главную цель.

Так что просто используйте обычный таймер здесь.

+0

Есть ли что-нибудь, о чем я должен знать при использовании обычного таймера? Я вспоминаю, что где-то читал, что элементы пользовательского интерфейса могут быть заблокированы, но я не уверен, что это необходимо/истинно. –

+1

Да, вам понадобится Dispatcher.Invoke() при обновлении GUI. Как обычно. –

1

Comparing Timer with DispatcherTimer Некоторые ответы, размещенные здесь, более конкретны для вашего вопроса, но я думаю, что эта ссылка предлагает некоторую общую информацию и советы.

Смежные вопросы