none
Windows service com C# RRS feed

  • Pergunta

  • Criar Windows Service com C#. preciso fazer e gostaria de uma ajuda. Estou pesquisando na net, mas qualquer ajuda de quem já fez é legal.
    terça-feira, 21 de agosto de 2012 01:09

Respostas

  • Então... Daí eu acredito que o Windows Service... Não seria o tipo de aplicativo recomendado...

    Pois, NÃO TENHO CERTEZA, mas ele não vai abrir uma janela.

    Precisaria confirmar essa informação...

    Se vc executar o mesmo código, numa aplicação Console, por exemplo... vc vai conseguir abrir normal...

    O Windows Service geralmente é utilizado para executar aplicações em Background... Sem muita interatividade com o usuário...

    Espero estar ajudando...

    Não se esqueça de marcar como útil ou sinalizar como resposta.

    Abraço!

    • Marcado como Resposta pnet sexta-feira, 24 de agosto de 2012 14:33
    sexta-feira, 24 de agosto de 2012 03:41

Todas as Respostas

  • Bom dia. Do que você precisa exatamente??

    Veja alguns exemplos:

    Criando um Windows Service

    http://programandodotnet.wordpress.com/2010/07/18/criando-um-windows-service/

    Criando Windows Service com C#
    http://www.edibertoalves.com.br/blog/criando-windows-service-com-c/

    Qualquer dificuldade poste aqui.


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    terça-feira, 21 de agosto de 2012 12:34
  • A questão é simples, vou dar uma estudada nesses links que vc passou. Eu tenho uma tabela de agendamento. Esses agendamento inclui execução de programas, DTSX e etc... O que preciso é fazer o serviço executar as tarefas agendadas no seu devido tempo. É isso que irei fazer. A dúvida está na criação do serviço.
    terça-feira, 21 de agosto de 2012 12:59
  • É bem tranquilo. Você pode trabalhar com um Timer. Com isto de tempos em tempos seu serviço vai fazer uma verificação e executar o que você precisa.



    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    terça-feira, 21 de agosto de 2012 13:06
  • A minha dúvida é simples, mas para mim não está sendo. O que eu não estou conseguindo é como pegar uma lista retornada pelo método, pelo serviço, pois como não tenho uma interface, não sei como fazer. Abaixo meu método e como pegar no OnStart, por exemplo, a lista do método PesquisaTodosAgendamento().

    public partial class Service1 : ServiceBase
        {

            public Service1()
            {
                InitializeComponent();
            }

            protected override void OnStart(string[] args)
            {
            }

            protected override void OnStop()
            {
            }

            private Lista<Entity.ExportacaoAgendamento> PesquisaTodosAgendamento()
            {
                Lista<Entity.ExportacaoAgendamento> listaAgendamento = new Lista<Entity.ExportacaoAgendamento>();
                listaAgendamento = Sistema.Infrastructure.Repository.ExportacaoAgendamento.RetornarTodos();

                return listaAgendamento;
            }
        }

    terça-feira, 21 de agosto de 2012 18:25
  • Você tem que colocar um Timer para ser executado no OnStart... com este Timer (configura o tempo de 20 segundos ou mais) vai dar tempo de você "atachar" o processo e debugar.

    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    terça-feira, 21 de agosto de 2012 18:50
  • Olá amigo, faça da seguinte forma:

    Crie uma variável no escopo do seu Windows Service que será o seu timer, conforme o Paulo está dizendo:

    System.Timers.Timer MyTimer;

    Em seguida no seu OnStart, proceda da seguinte forma:

    protected override void OnStart(string[] args)
    {
    //Tempo para 20 segundos
    MyTimer = new System.Timers.Timer(20000);
    MyTimer.Elapsed += new ElapsedEventHandler(MyTimer_Elapsed);
    MyTimer.Start();
    }
    
    void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
    try
    {
    MyTimer.Stop();
    
    //SEU CÓDIGO AQUI
    }
    catch(Exception)
    {
    //ALGUM LOG, MAS NÃO DEIXE LEVANTAR A EXCEÇÃO
    }
    finally
    {
    MyTimer.Start();
    }
    }

    Repare que vc vai criar o timer e executar as tarefas dentro do "Tick" do timer... E não do Windows Service...

    Note também que no evento do timer, eu coloco um "MyTimer.Stop();", às vezes qdo o tempo é curto e as linhas de código para executar demandam tempo... isso pode atrapalhar bastante, pois as execuções poderão "encavalar", ou seja, o timer pode dar um "tick" antes do "tick" anterior terminar... e isso é ruim... A MENOS QUE UMA ITERAÇÃO DO TIMER NÃO DEPENDER DO QUE ACONTECEU NA OUTRA, mas para esses casos, pense em usar Parallel dentro do Timer... Para que uma iteração não interfira na outra.

    Dentro do "finally" tem o "MyTimer.Start();" pois ao entrar em "Elapsed" eu paro o timer, daí, não importa o que aconteça dentro do try{}catch(){} ele será startado novamente.

    Uma dica importante é o seguinte...

    ANTES de programar o Windows Service... Crie uma aplicação Console que irá fazer EXATAMENTE a mesma coisa que o Windows Service, e faça os devidos DEBUG's na sua aplicação Console... Depois Coloque o código feito, testado e finalizado, no seu Windows Service... Isso irá ajudar bastante na produtividade... Pois debugar Windows Service é tenso...

    Espero ter ajudado.


    • Editado Jefferson Balivo quinta-feira, 23 de agosto de 2012 12:53 Nome erro de variável
    quinta-feira, 23 de agosto de 2012 11:59
  • Fiz esse código e não funcionou. Não consigo executar a calculadora do windows ou outro aplicativo. Escrever um log eu fiz, mas executar um programa, isso não conseguir ainda.

     public Service1()
            {
                InitializeComponent();
            }

            protected override void OnStart(string[] args)
            {
                Timer timer;
                timer = new Timer(new TimerCallback(timer_Tick), null, 15000, 60000); 
            }

            protected override void OnStop()
            {
            }

            private void timer_Tick(object sender)

            {
                //System.Diagnostics.Process.Start("%windir%\\system32\\calc.exe");
                System.Diagnostics.Process.Start("C:\\Windows\\system32\\calc.exe");
            }

    quinta-feira, 23 de agosto de 2012 14:41
  • Jeferson, fiz assim e ainda a calculadora não subiu

    System.Timers.Timer MyTimer;

            public Service1()
            {
                InitializeComponent();
            }

            protected override void OnStart(string[] args)
            {

                //Tempo para 20 segundos
                MyTimer = new System.Timers.Timer(20000);
                MyTimer.Elapsed += new ElapsedEventHandler(MyTimer_Elapsed);
                MyTimer.Start();
                }

            void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
            {
                try
                {
                    MyTimer.Stop();

                    System.Diagnostics.Process.Start("C:\\Windows\\system32\\calc.exe");
                }
                catch (Exception)
                {
                    //ALGUM LOG, MAS NÃO DEIXE LEVANTAR A EXCEÇÃO
                }
                finally
                {
                    MyTimer.Start();
                }
            }          

            protected override void OnStop()
            {
            }

            private void timer_Tick(object sender)

            {
                //System.Diagnostics.Process.Start("%windir%\\system32\\calc.exe");
                System.Diagnostics.Process.Start("C:\\Windows\\system32\\calc.exe");
            }
        }

    quinta-feira, 23 de agosto de 2012 21:43
  • Caiu a ficha da seguinte forma. Em realidade está chamando sim, a calculadora, só que eu não visualizo. No gerenciador de tarefas, dá pra var a calc.exe sendo executada, mas não visualizo. O que faço nessas condições?
    sexta-feira, 24 de agosto de 2012 01:13
  • Então... Daí eu acredito que o Windows Service... Não seria o tipo de aplicativo recomendado...

    Pois, NÃO TENHO CERTEZA, mas ele não vai abrir uma janela.

    Precisaria confirmar essa informação...

    Se vc executar o mesmo código, numa aplicação Console, por exemplo... vc vai conseguir abrir normal...

    O Windows Service geralmente é utilizado para executar aplicações em Background... Sem muita interatividade com o usuário...

    Espero estar ajudando...

    Não se esqueça de marcar como útil ou sinalizar como resposta.

    Abraço!

    • Marcado como Resposta pnet sexta-feira, 24 de agosto de 2012 14:33
    sexta-feira, 24 de agosto de 2012 03:41
  • Bem, não tenho certeza que é isso, ou seja, que não mostra nada. Para minha necessidade, isso basta, porque o que vai ser executado é DTSX, Envio de Email e etc, coisas que não interajam com o usuário. Mas fica a pesquisa em saber se realmente ele pode executar um Prog para o usuário ou não. Mesmo assim, valeu. Estava funcionando desde o começo e não sabia.
    sexta-feira, 24 de agosto de 2012 14:32
  • Bom dia. Do que você precisa exatamente??

    Veja alguns exemplos:

    Criando um Windows Service

    http://programandodotnet.wordpress.com/2010/07/18/criando-um-windows-service/

    Criando Windows Service com C#
    http://www.edibertoalves.com.br/blog/criando-windows-service-com-c/

    Qualquer dificuldade poste aqui.


    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    Boa tarde Paulo!

    Achei muito bom seus exemplos de windows services, e gostaria de saber se você teria um de windows service para envio de email?!

    Obrigado!

    quinta-feira, 25 de outubro de 2012 18:57