Производительность System.Windows.Forms.Timer - PullRequest
1 голос
/ 24 января 2009

У нас есть приложение, содержащее множество пользовательских элементов управления, которые часто обновляются на основе System.Windows.Forms.Timer. Могу ли я добавить экземпляр Timer к каждому элементу управления peformancewise? Или я должен иметь один таймер Singleton, который работает все время, который будет использоваться всеми экземплярами? Что на самом деле происходит под капотом? Будет ли дополнительный поток (для подсчета) для каждого таймера?

Ответы [ 3 ]

2 голосов
/ 24 января 2009

System.Windows.Forms.Timer реализовано через добрые времена User32 Timers . Как таковые, они не используют или требуют отдельного потока для работы. Тем не менее, они являются ограниченным ресурсом, так как их не может быть бесконечное количество.

Когда вы говорите, что у вас есть лот пользовательских элементов управления с использованием таймеров, что вы на самом деле подразумеваете под "много"? 10? 10000?

Когда вы говорите, что они часто обновляются, что вы на самом деле имеете в виду? Каждую минуту? Каждые 100 миллисекунд? Как быстро их таймеры могут стрелять?

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

1 голос
/ 24 января 2009

Таймеры срабатывают в разное время для каждого элемента управления? Каждому из них нужен отдельный таймер?

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

1 голос
/ 24 января 2009

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

Я думаю, что не мешало бы иметь отдельный таймер для контроля за каждым. По крайней мере, это определенно не будет иметь никакой разницы в производительности по сравнению с использованием одного таймера. Код станет более читабельным, хотя. ;)

Кстати - при сегодняшнем массовом переходе на несколько процессорных ядер подумайте, возможно, это место, где вы не сможете извлечь из этого пользу.

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