• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Knitter

Timers dentro de Seviços de Windows.

6 mensagens neste tópico

Preciso de fazer um "Windows service" em C#.net e preciso usar 2 timers, objectos do tipo System.Timers.Timer.

Mas não estou a perceber o que acontece se os dois timers dispararem o evento ao mesmo tempo, ou, o que acontece ao evento do segundo timer se for disparado antes do evento do primeiro ter terminado as suas acções.

Uma alternativa que pensei foi a de criar duas threads, uma para cada timer, uma vez que as acções são diferentes para cada situação mas não estou a perceber como recebo o evento do timer. Isto porque uma thread termina quando o método de execução terminar...

Parece-me que vai aqui uma grande confusão, não estou nada habituado a este sistema de threads....

Anexei um PDF com o esquema do fluxo de código, o evento A é controlado por um timer e o que resultar do processamento irá afectar ambos os timers, o evento B é controlado por outro timer e no seu fluxo acede a dois webservices, de um obtendo dados, para outro enviando.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Realmente o teu problema é um bocado confuso.

Ponto número 1: O código associado ao evento B só pode ser executado depois de ter ocorrido o evento A e o respectivo código ser executado?

Se sim, então assim à primeira vista o que me ocorre logo é ou teres uma variável global para não deixar o código de A correr enquanto B não deixar, ou então ser o próprio evento B a despoletar um evento A no fim do respectivo código.

Se o problema for apenas o facto de os códigos respeitantes aos eventos A e B não poderem ser executados em simultâneo podes usar Locks (ou lá como é que se chama o sistema de exclusão mútua do C#).

Quanto à alternativa que propões, podias ter um método que o que faz é apenas iniciar uma thread e associar esse método ao timer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1.O  System.Timers.Timer é um obj derivado de OBJ Thread. não faz sentido (neste caso especifico) criares uma thread para usares um timer.

2. Para garantires que o Evento A é processado primeiro que o evento B, coloca o timer A com um tempo inferior .

3. Os timers podem ser ciclicos, lembra-te disso.

4. Para garantires que quando processas o evento A sem que  o Evento B despolete no seu (ev A) processamento :

                No inicio de processamento do evento A, suspende o timer B.

                Faz o mesmo no despoletamento do evento B.

5. Cuidado com timers e windows services... especialmente com timers que têm ciclos muito rápidos, tipo 1 segundo ou menos.

Ainda no teu problema... Se o que tu queres é ter um timer que monitorize as alterações a um ficheiro , e outro que esteja sempre a comunicar com algo de x em x tempo, talvez devas seguir outra abordagem.

1. Colocas um FileWatcher ao ficheiro que queres monitorizar. (tens varios exemplos no ggole http://www.sitedev.com/source/programmer/samples/watcher.asp)

2. Colocas 1 timer que faça a comunicação (Timer ;)

3. Quando disparar o evento OnChanged (do filewatcher), Suspende o timer B -> faz o que tens a fazer -> Reactiva o timer B.

penso que esta é uma solução mais elegante/funcional .

/ing

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez tenha gerado um pouco de confusão com o meu tópico...

O que eu queria perceber é o que se passa e como se passa o processamento dos eventos com os timers.

Não quero monitorizar ficheiros. Passo a explicar. O serviço que estou a fazer tem por objectivo aceder periodicamente a um webservice, daí o timer 1, e com os dados obtidos criar um XML que passará a enviar a alguns nós de uma malha aplicacional. Como não pretendo bloquear o envio do XML, ou melhor, não pretendo que o envio seja sequencial e que o ultimo nó tenha de esperar que todos os outros recebam o XML, irei criar threads para enviar o XML.

Por outro lado o serviço tem alguns parametros que têm de ser fornecidos e que podem ser alterados durante a execução do serviço, assim tenho uma aplicação windows que não é mais que um front-end para a criação de um ficheiro de configurações...... hum.... monitorizar o ficheiro de configurações.... hum.... ok, está a acender-se uma luzinha!

Obrigado pelas respostas vou ver o que daqui sai... já volto ;)

ah e já agora, odeio esta plataforma! :(:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes sempre usar threads sincronizadas, em que a segunda espera pela primeira, ou aceder a um pipe ou área de memória partilhada para efectuar o controlo se quiseres usar timers.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Demasiado para o objectivo do trabalho, é um trabalho académico, e embora  os tente fazer sempre da melhor maneira há que ponderar a relação custo/benefício, e os objectivos da cadeira centram-se em webservices e integração de aplicações, neste caso, integração de excel para gerar meia dúzia de gráficos.

Mesmo para controlar o serviço poderia criar um sistema mais elaborado que o de um ficheiro de texto, no entanto o valor que essa solução teria no final seria mínimo em relação ao tempo que teria de investir, e tenho outras cadeiras para fazer ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora