Jump to content

Programa C# sempre em execução


Sponsor
 Share

Recommended Posts

Podes criar um executável e agendar no scheduler do windows o que precisares.

Também podes criar um serviço windows, mas a primeira opção é mais simples porque o scheduler do windows já tem várias opções para configurar a execução do teu programa.

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Podes criar um executável e agendar no scheduler do windows o que precisares.

E algo que não precise que agedar nada no windows. Algo como iniciar o executavel (e como o pc estará sempre ligado, e ao reiniciar inicia o exe) e ser o próprio programa encarregue de x em x tempo executar as verificações?

Obrigado!

Link to comment
Share on other sites

Tens de criar um serviço e registá-lo no Windows.

Assim, sempre que o sistema arrancar, o teu serviço arranca também.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

E algo que não precise que agedar nada no windows. Algo como iniciar o executavel (e como o pc estará sempre ligado, e ao reiniciar inicia o exe) e ser o próprio programa encarregue de x em x tempo executar as verificações?

Obrigado!

Podes criar um executável (console application) e executá-lo. Para correr quando o pc reinicia colocas na pasta startup do menu iniciar.

O único senão neste caso é que tens que ser tu a gerir por código as execuções de x em x tempo.

Tens que te preocupar com:

- Criar um Timer que está sempre a correr.

- Prevenir o caso de não ser executado uma vez. O que fazer neste caso?

- O processo demorou mais do que previsto? Executo outra vez? Espero algum tempo até voltar a executar? Não executo?

- Se não executo quando volto a executar?

- O que faço em caso de erro? Ignoro? Volto a correr de seguida?

- Deve executar com permissões de administrador?

- O utilizador tem que ter sessão iniciada para correr?

- Se for portátil deve executar só com bateria? Deve executar se o pc não estiver idle?

- Vale a pena correr se não houver ligação de rede?

- Devo guardar um histórico de execuções?

- Devo interromper a tarefa se demorar mais de x tempo?

Se utilizares o scheduler do windows, isto tudo é de borla.

Podes agendar e configurar pela 1ª vez e exportas a configuração (é um xml).

Quando colocares noutro pc, importas a configuração.

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Obrigado pelas respostas!

bruno1234,

o que eu tenho neste momento é isso mesmo um console application com um timer que de x em x tempo eexecuta o que quero. O que acontece é que ao fim de algum tempo deixa de executar.

M6,

Consigo mais tarde criar um pacote de instação, que permita instalar um programa e depois esse serviço?! o programa vai precisar desse serviço em funcionamento!

Link to comment
Share on other sites

Criar o pacote de instalação não será complicado. Tenho uma aplicação feita com a situação que descreves: Um serviço é executado a intervalos regulares e contém uma aplicação de monitorização, as duas são instaladas automaticamente por um installer InnoSetup. É o próprio serviço que contém métodos para se registar automaticamente no SCM do Windows e para remover o registo durante a desinstalação.

Se não me esquecer coloco aqui o código exemplo.

Link to comment
Share on other sites

Este é um exemplo da classe principal dos meus serviços que se "auto-instalam/removem". Quando a aplicação é executada em modo interactivo (consola/conta interactiva) é feita a adição ou remoção do serviço no SCM. Caso seja iniciada pelo SCM (modo não interactivo) então é instanciada a classe que implementa o serviço e este é iniciado.

É depois a classe MyService que contém uma instância de System.Timers.Timer que fornece eventos a intervalos regulares.

using System;
using System.ServiceProcess;
using System.Runtime.InteropServices;
using System.Threading;

namespace MyServiceNS {

   public static class MyServiceApp {

    [DllImport ("kernel32.dll")]
    public static extern Boolean AllocConsole ();

    public static void Main (String[] args) {

	    if (System.Environment.UserInteractive) {
		    switch (String.Concat (args)) {
			    case "--install":
				    //executado pelo script InnoSetup durante a instalação
				    System.Configuration.Install.ManagedInstallerClass.InstallHelper (new String[] { System.Reflection.Assembly.GetExecutingAssembly ().Location });
				    break;
			    case "--uninstall":
				   //executado pelo script InnoSetup durante a desinstalação
				    System.Configuration.Install.ManagedInstallerClass.InstallHelper (new String[] { "/u", System.Reflection.Assembly.GetExecutingAssembly ().Location });
				    break;
		    }
	    } else {
		    ServiceBase.Run (new MyService ());
	    }
    }
   }
}
  • Vote 1
Link to comment
Share on other sites

Viva,

knitter, mesmo usando o serviço tenho de ter em atenção os aspectos referidos pelo bruno1234, certo?

Neste momento, ainda não estou a usar o console application que criei! Quando tiver mesmo que definir uma solução definitiva e se tiver dúvidas exponho-as aqui.

Obrigado pela atenção!

Link to comment
Share on other sites

Um serviço é gerido pelo sistema operativo, uma tarefa agendada como o Bruno indicou é controlada pela aplicação de agendamento de tarefas, são formas diferentes e com vantagens/desvantagens diferentes.

Pessoalmente não gosto do sistema de agendar tarefas do windows, tem demonstrado falhar mais do que é suposto.

- Criar um Timer que está sempre a correr.

Se for um serviço podes usar a classe Timer que indiquei e que é a recomendada para esta situação.

- Prevenir o caso de não ser executado uma vez. O que fazer neste caso?

Igual nos dois casos se não quiseres usar o comportamento por omissão. No caso dos serviços, a execução só falha se o código do serviço falhar (o teu código) ou se o computador estiver desligado, fora isso o serviço será sempre executado.

- O processo demorou mais do que previsto? Executo outra vez? Espero algum tempo até voltar a executar? Não executo?

Não faz muito sentido ter isto em conta, a não ser que estejas a executar uma tarefa onde exista um tempo limite. De qualquer modo é igual tanto num como no outro, se é um ponto a teres em conta tem de ser controlado pelo teu código, não interessa se é uma tarefa agendada ou um serviço.

- Se não executo quando volto a executar?

Outra coisa que não me parece fazer sentido. Se não executaste voltas a executar no próximo momento de acordo com o intervalo de repetição. Se não executaste porque o código tem erros não vais conseguir voltar a executar. Se não executaste porque o computador esteve desligado, no caso de um serviço, assim que o computador voltar a ser ligado o processo iniciará normalmente com a contagem do tempo.

- O que faço em caso de erro? Ignoro? Volto a correr de seguida?

Qual erro? Erros da tua aplicação terão de ser controlados sempre por ti. Tanto as tarefas agendadas como os serviços têm mecanismos de controlo no caso de erros.

- Deve executar com permissões de administrador?

O que é que isto tem a ver com ser tarefas, executáveis ou serviços? Se as funções que queres desempenhar necessitam de permissões elevadas, qualquer que seja a solução terás sempre de ter isso em conta.

- O utilizador tem que ter sessão iniciada para correr?

Um serviço executa fora das sessões normais de utilizadores. Podes configurar para executar com uma conta de utilizador específica.

- Se for portátil deve executar só com bateria? Deve executar se o pc não estiver idle?

Impossível de controlar apenas com o que o SCM oferece, logo se usares um serviço terás de controlar isto manualmente.

- Vale a pena correr se não houver ligação de rede?

Não será algo que a aplicação vê antes de tentar executar a tarefa? Acho que não tem a ver com o sistema de agendamento usado.

- Devo guardar um histórico de execuções?

Seja com serviço seja com tarefas agendas a facilidade de registar execuções é a mesma.

- Devo interromper a tarefa se demorar mais de x tempo?

Outra coisa que me parece dependente do que a aplicação faz e não do tipo de sistema usado para repetição.

Naturalmente, usa o que te parecer melhor, quer tarefas agendadas quer serviços com timers são relativamente simples de usar na execução de tarefas com intervalos regulares. O que escrevi é mais um opinião que outra coisa, pessoalmente sinto que os serviços são mais fiáveis, pelo menos têm falhado menos.

Link to comment
Share on other sites

Viva,

knitter, mesmo usando o serviço tenho de ter em atenção os aspectos referidos pelo bruno1234, certo?

Neste momento, ainda não estou a usar o console application que criei! Quando tiver mesmo que definir uma solução definitiva e se tiver dúvidas exponho-as aqui.

Obrigado pela atenção!

Aquilo são apenas casos em que o agendador de tarefas do windows faz, e que não precisas de fazer nenhum código para teres aquelas funcionalidades.

Só são úteis se precisares delas.

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.