Comparando Timer com DispatcherTimer

98

qual é a diferença between System.Windows.Forms.Timer()e System.Windows.Threading.DispatcherTimer()? Em quais casos devemos usá-los? alguma prática recomendada?

paradisonoir
fonte

Respostas:

111

Windows.Forms.Timerusa o loop de mensagem do Windows Forms para processar eventos de cronômetro. Deve ser usado ao escrever eventos de temporização que estão sendo usados ​​em aplicativos Windows Forms e você deseja que o temporizador seja acionado no thread de interface do usuário principal.

DispatcherTimeré o mecanismo de temporização do WPF. Ele deve ser usado quando você deseja lidar com o tempo de maneira semelhante (embora isso não se limite a um único thread - cada thread tem seu próprio despachante) e está usando o WPF. Ele dispara o evento no mesmo encadeamento que o Dispatcher.

Em geral, WPF == DispatcherTimere Windows Forms == Forms.Timer.

Dito isto, também System.Threading.Timerexiste um temporizador classque dispara em um thread separado. Isso é bom para tempo puramente numérico, em que você não está tentando atualizar a IU, etc.

Reed Copsey
fonte
1
Obrigado por sua sua resposta rápida. Portanto, isso significa que sempre que eu quiser ter um cronômetro relacionado à IU, devo usar o DispatcherTimer e, quando quiser disparar um cronômetro, que não quero congelar o UL, devo usar System.Threading.Timer separadamente fio. A segunda pergunta é: se eu quiser usar DispatcherTimer e quiser ter um cronômetro não vinculado à IU, devo chamá-lo em um thread separado usando System.Threading.Timer ou ainda DisptacherTimer?
paradisonoir
3
Depende do que você está tentando fazer. Raramente uso System.Threading.Timer - geralmente fico com o Dispatcher Timer e, em seguida, faço seu TRABALHO (que é o que poderia bloquear sua IU) em outro thread, usando algo como BackgroundWorker. Os cronômetros realmente nunca devem bloquear sua IU, a menos que você esteja fazendo "muito" trabalho em seu manipulador de eventos.
Reed Copsey
Estou tendo um problema com o DispatcherTimer consumindo processador com o tempo. Existe uma boa maneira de lidar com isso?
discorax
Verifique o que especificamente está consumindo a CPU. Você está criando muitos temporizadores que não estão sendo interrompidos?
Reed Copsey
3
Certifique-se de definir a propriedade de intervalo corretamente. Não faça isso: timer1.Interval = new TimeSpan (1000); // "1000" representa ticks, não milissegundos! A CPU estava super alta, até que eu corrigi com isso: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best de
4

Encontrei um bom artigo sobre timers com pequenos exemplos aqui: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Como uma conclusão:

Se DoSomething () manipula os componentes da GUI, então com o Timer você precisa usar: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} já que você não pode acessar os controles da GUI diretamente de uma thread diferente. Com o DispatcherTimer você faz não precisa fazer isso.

Se DoSomething () realizar uma tarefa demorada, a GUI irá travar no caso do DispatcherTimer. No caso do Timer não o fará, pois o método longo é executado em um thread diferente

Seekeer
fonte