2013-03-07 3 views
0

У меня есть приложение Forms с несколькими таймерами в нем, все время выполняющее задание в разное время, но теперь у меня возникли проблемы с моим приложением на «не очень хороших» компьютерах. Моя проблема заключается в том, что GUI не получает нужное время. Просто простой кнопочный щелчок с очень незначительной задачей может занять довольно много времени. И я чувствую, что его «толчок» сам, который получает delayd. Итак, теперь, на мой вопрос, есть ли способ объяснить GUI по таймерам? Например, пропустите галочку, если GUI должен работать? (Нет таймера, это важно, что он не может пропустить когда-нибудь). Или есть ли другой способ, позволяющий графическому интерфейсу работать? Btw im, используя System.Timers.Timer, заключается в том, что правильный выбор над ex.System.Windows.Forms.Timer.Приоритет в графическом интерфейсе с таймерами C#

ответ

1

Вы должны использовать System.Windows.Forms.Timer, если используете WinForms.

Этот таймер оптимизирован для использования в приложениях Windows Forms и должен использоваться в окне.

На самом деле не имеет значения, если у вас есть 1 или 100 таймеров в вашем приложении. Важно то, что вы делаете в обратных вызовах таймера (обработчик Tick). Любой код, который занимает больше, чем «крошечный бит» времени, вызовет «вялое» чувство вашего пользовательского интерфейса.

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

1

Использование нити

Создать новую (отдельную) нить, которая не будет мешать таймеры и ваши задачи будут выполнены одновременно.

Но если вы обрабатываете сложные данные, дождитесь окончания всех потоков, а затем продолжите дальше!

Я надеюсь, что это поможет :)

+0

Если я запустил нить внутри таймеров, нужно ли просто запустить ее вверх и закрыть ее, когда это будет сделано? – Nick3

1

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

Его не так сложно, как кажется, просто прочитайте tutorials и вуаля.

0

Если вы хотите запустить небольшую задачу в своем событии таймера, лучше сделать ее в отдельном потоке. Shorthest/простой способ что-то вроде этого:

ThreadPool.QueueUserWorkItem((o) => { 
    // Do lenghty stuff 
    // ... 
    BeginInvoke((MethodInvoker)delegate() { 
     // Update UI, if necessary 
    }); 
}); 

Я не большой поклонник System.Timers.Timer лично. Я предпочитаю System.Threading.Timer, если мои задачи длинные и/или не-gui, и System.Windows.Forms.Timer для коротких обновлений GUI (он запускается в потоке графического интерфейса, поэтому нет необходимости в Invoke).

Одна проблема с запуском задач строго периодического таймера заключается в том, что он срабатывает, срабатывает и срабатывает ... даже если ваши ранее запущенные задачи все еще не завершены (если вы не остановите/не запустите его или некоторые из них). System.Threading.Timer удобен таким образом, что вы можете запустить его для запуска один раз, затем, после того, как задача запущена и завершена, запустите ее еще раз.

finally { 
    new System.Threading.Timer((o) => { ... }, null, 60000, 0); 
} 
Смежные вопросы