none
Como aumentar o tempo de um serviço do windows? RRS feed

  • Pergunta

  • boa tarde, estou com um problema e não estou conseguindo resolver.

    Criei um serviço para comparar valores, sendo que a consulta é um pouco demorada.

    Ao iniciar o meu serviço ele tem um limite de 30 segundos e a consulta ultrapassa esse tempo, estou querendo saber se é possível ao mentar esse tempo.  


    segunda-feira, 6 de abril de 2015 19:38

Respostas

  • O que você pode fazer para melhorar é o seguinte
    public Service1()
    {
    System.Timers.Timer timer = new System.Timers.Timer();
                timer.Interval = 60000; // 60 seconds
                timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);
                timer.Start();
    }
    
    public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
            {
                //seu antigo codigo aqui
            }
    Assim provavelmente não ira dar erro.

    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco


    • Editado Alexsandro Bertoncini terça-feira, 7 de abril de 2015 13:00 Alteração no nome do evento
    • Marcado como Resposta Jeff Valentim terça-feira, 7 de abril de 2015 13:56
    terça-feira, 7 de abril de 2015 12:39

Todas as Respostas

  • Olá!

    Você pode ir nas propriedades do seu site alocado no "IIS" e configurá-lo na aba diretório base/configuração/opções e definir o tempo de sessão da sua aplicação.



    Você possui alguma conexão com banco de dados?  Pode haver problemas no seu "Timeout" entre o banco de dados. Então, altere a propriedade "CommandTimeout" de um "objeto SQLCommand" no caso de operações demoradas com o banco de dados (Consultas, Atualizações, entre outros itens.)

    Espero ter lhe ajudado!


    MS INFORMATICA - Projeto Marinner



    segunda-feira, 6 de abril de 2015 19:51
  • Boa tarde Marcio.

    Único problema que estou tendo é apenas com o serviço , até pq essa consulta já está em processamento, ao debugar o processo não ocorre o  "Timeout". Apenas o serviço que não funciona se eu adicionar essa tarefa de vários clientes.

    Fiz o teste com um cliente e obtive sucesso.

    segunda-feira, 6 de abril de 2015 20:06
  • Pode nos mostrar como foi criado esse serviço para podemos te auxiliar de uma maneira mais eficiente?

    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    segunda-feira, 6 de abril de 2015 22:53
  • Essa é a consulta que demora e com isso nao executa o serviço.

    terça-feira, 7 de abril de 2015 12:29
  • O serviço fica direto.

    terça-feira, 7 de abril de 2015 12:31
  • O que você pode fazer para melhorar é o seguinte
    public Service1()
    {
    System.Timers.Timer timer = new System.Timers.Timer();
                timer.Interval = 60000; // 60 seconds
                timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);
                timer.Start();
    }
    
    public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
            {
                //seu antigo codigo aqui
            }
    Assim provavelmente não ira dar erro.

    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco


    • Editado Alexsandro Bertoncini terça-feira, 7 de abril de 2015 13:00 Alteração no nome do evento
    • Marcado como Resposta Jeff Valentim terça-feira, 7 de abril de 2015 13:56
    terça-feira, 7 de abril de 2015 12:39
  • Já tinha feito isso, só nao aumentei o tempo, irei testar.

    grato.

    terça-feira, 7 de abril de 2015 12:41
  • this.Metodo ???

    Não entendi.

    terça-feira, 7 de abril de 2015 12:45
  • Ja realizei a alteração, ali na verdade vai o nome do Evento do timer "OnTimer"

    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    terça-feira, 7 de abril de 2015 13:02
  • Estou testando e querendo entender, estou com um problema, não estou entendo o motivo de ele não entrar no metodo onTimer para executar o processamento da minha consulta. 

    Isso quando estou debugando para verificar, pode me explicar o motivo ?


    terça-feira, 7 de abril de 2015 14:08
  • Não sei o motivo, mas ele não está indo na minha consulta. Preciso que ele vá na consultar e a cada loop ele mostre apenas 2 linhas  de cada cliente.

    Ele vai passar pelo loop enquanto tiver cliente.

    dt = clientes.

    Preciso que essas duas linhas de cada cliente seja registrada em um txt.

       for (int j = 0; dt.Rows.Count > j; j++)
                        {
                            if (dt.Rows[j]["NomeCategoria"].ToString() == "MUNDO VIP")
                            {
                                valorMvip.Add(dt.Rows[j]["excedente"].ToString());
                                valorMundoVip.Add(dt.Rows[j]["Valor"].ToString());
                            }
                            else if (dt.Rows[j]["NomeCategoria"].ToString() == "LDI")
                            {
                                valorLid.Add(dt.Rows[j]["excedente"].ToString());
                                valorLdi_toal.Add(dt.Rows[j]["Valor"].ToString());
                            }

                        }

                    }

    HELP ME ! :D

    terça-feira, 7 de abril de 2015 15:22
  • Conseguiu entrar no OnTimer?

    a sua tabela retorno resultado Rows?


    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    terça-feira, 7 de abril de 2015 16:54
  • Não entra no OnTimer, passa direto.
    terça-feira, 7 de abril de 2015 17:09
  • Amigo, faz a seguinte alteração, o Timer faz o serviço ser chamado de tempos em tempos, acho que não é isso que você deseja.

    Do jeito que está agora, a cada Minuto ele ira chamar o o OnTimer.

    para funcionar somente uma vez quando subir o serviço utilize o evento OnStart... Esse tutorial ensina criar legal um serviço

     protected override void OnStart(string[] args)
            {
                // TODO: Add code here to start your service.
                base.OnStart( args );
            }

    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    terça-feira, 7 de abril de 2015 18:05
  • Primeiramente obrigado, vc tem me ajudado bastante.

    Bertoncini, já tinha feito isso antes, mas  o erro ocorre por causa da minha consulta.

    Quando coloco apenas um cliente, o processo é iniciado normalmente, mas quando faço um for para executar cada um cliente o processo é demorado.

    Só para lembrar o problema não é com com a conexão com o banco e sim com o tempo da consulta.

    Tela do erro

     

    terça-feira, 7 de abril de 2015 18:41
  • Esse erro ocorreu quando o serviço demora para terminar sua inicialização.

    Exemplo muita informação no construtor, porém utilizando o evento OnStart não é para acontecer  esse problema, pois o Serviço já foi inicializado.


    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    terça-feira, 7 de abril de 2015 19:16
  • É possível determinar um tempo para executar cada cliente ?

    vamos dizer que tenho  30 clientes e comece a executar o serviço de 5 em 5 minutos para cada cliente.

    Ex:

    Vamos dizer que comece o serviço as 00:00

    Cliente 1 = 00:00 

    cliente 2 = 00:05

    cliente 3 = 00:10 

    Cada cliente vai mostrar apenas duas 2 linhas. 

    1 linha do campo LDI 

    1 linha do campo VIP

    terça-feira, 7 de abril de 2015 19:44
  • Alexsandro, mas essa consulta funciona normalmente.

    Sem erro, só que demora um pouco.

    terça-feira, 7 de abril de 2015 19:46
  •    public Service2()
            {
                 InitializeComponent();
            }
            protected override void OnStart(string[] args)
            {

                Timer timer1 = new Timer(new TimerCallback(timer1_Tick), null, 15000, 60000);
                dt.Columns.Add("NomeCliente");
                dt.Columns.Add("NomeCategoria");
                dt.Columns.Add("excedente");
                SqlConnection con = new SqlConnection("banco");
                con.Open();
                string sql = "";
                DataTable dtLogin = dropdownlist();
                ArrayList valorMvip = new ArrayList();
                ArrayList valorLid = new ArrayList();
                ArrayList nomeClie = new ArrayList();
                ArrayList valorMundoVip = new ArrayList();
                ArrayList valorLdi_toal = new ArrayList();

                for (int i = 0; dtLogin.Rows.Count > i; i++)
                {
                    try
                    {
                        sql = "EXEC BILLINGCOBRANCA '2015-04-01','2015-04-05 23:59:59','"+dtLogin.Rows[i]     ["NomeCliente"].ToString() +"'";
                        SqlCommand cmd = new SqlCommand(sql, con);
                        SqlDataReader reader = cmd.ExecuteReader();

                        dt.Load(reader);

                        nomeClie.Add(dtLogin.Rows[0]["NomeCliente"].ToString());

                        for (int j = 0; dt.Rows.Count > j; j++)
                        {
                            if (dt.Rows[j]["NomeCategoria"].ToString() == "MUNDO VIP")
                            {
                                valorMvip.Add(dt.Rows[j]["excedente"].ToString());
                                valorMundoVip.Add(dt.Rows[j]["Valor"].ToString());
                            }
                            else if (dt.Rows[j]["NomeCategoria"].ToString() == "LDI")
                            {
                                valorLid.Add(dt.Rows[j]["excedente"].ToString());
                                valorLdi_toal.Add(dt.Rows[j]["Valor"].ToString());
                            }

                        }

                    }
                    catch { }

                    dt.Clear();

                }

                con.Close();
              

                base.OnStart(args);
            }
        
            protected override void OnStop()
            {
                Thread.Sleep(40000);
                StreamWriter vWriter = new StreamWriter(@"c:\bila\TelecallFraude.txt", true); 
                vWriter.WriteLine("Servico Parado: PARADO");
                vWriter.Flush();
                vWriter.Close();
            }
            private void timer1_Tick(object sender)
            {
                for (int i = 0; dt.Rows.Count > i; i++)
                {
                    StreamWriter vWriter = new StreamWriter(@"c:\bila\TelecallFraude'" + dt.Rows[i] ["NomeCliente"].ToString() + "'.txt", true); 
                vWriter.WriteLine("Empresa:'" + dt.Rows[4]["Valor"].ToString() + "''" + dt.Rows[4] ["excedente"].ToString() + "' ");
                vWriter.Flush();
                vWriter.Close();
                }
                
            }
            public DataTable dropdownlist()
            {
                SqlConnection con = new SqlConnection("banco");
                con.Open();

                string sql = "select distinct IdCliente, NomeCliente from Cliente order by NomeCliente";
                SqlCommand cmd = new SqlCommand(sql, con);
                SqlDataReader reader = cmd.ExecuteReader();
                DataTable dt = new DataTable();
                dt.Load(reader);
                con.Close();

                return dt;
            }
    terça-feira, 7 de abril de 2015 20:46
  • Demora a executar a consulta? ou Demora a executar o Serviço?


    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    terça-feira, 7 de abril de 2015 22:53
  • a consulta é demorada e tbm ao iniciar o serviço pelo primeiro momento tbm é demorado, com isso ocorre o erro.

    Mostrado na imagem acima.

    Se eu colocar pra executar apenas um cliente o serviço inicia normalmente.

    quarta-feira, 8 de abril de 2015 12:57

  • Não sei se tem como parar o serviço e iniciar ele novamente com outro cliente e assim até o termino da consulta.

    Quando estou debugando a consulta é carregada corretamente, quando coloco pra iniciar o serviço ele ocorre o erro depois de 30 segundos.

    É a primeira vez que estou criando um serviço.


    quarta-feira, 8 de abril de 2015 14:12